Jurus Nimja seribu kepusingan
Watashi minggu kemarin setelah membikin tulisan tumbukan gamedev, nemu artikel tentang command and control alias C2. Ga related to gamedev tapi asik. Namun, pilihan bahasa pemrograman yang saya kuasa kurang cocok untuk kasus ini. Maka dari itu saya menyambut tahun baru dengan belajar bahasa pemrograman yang satu ini. Nodoka masih wip hehe
Namanya Nim, alasanya syntaksnya beridentansi, vocabularynya bahasnya simple misal mutex disana namanya Locs, array namanya Sequence, dsb, compiled to native binary, static type dan berjalan di banyak sistem operasi.
Mirip python tapi warna kuning.
Install NIM
Untuk membuat nim tersedia ditempat kita ada banyak caranya, yang paling simple pakai paket manager, download binarynya langsung terus jalanin finish.exe
atau pakai choosenim.
Kedua pertama cara yang saya rekomendasikan, kenapa? pakai opsi ketiga memang mudah tapi tidak compatibel dengan beberapa tooling di ekosistem seperti nimlangserver
.
Cara kerja Nim
Proses kompilasi Nim memiliki target ke berbagai jenis bahasa, seperti C yang nanti dikompile menjadi native executable binary dan ke javascript. Jadi kedua bahasa yang ditarget bisa dihubungankan dengan Nim.
Bahasa
Sintaks Nim di dominasi oleh identansi, :
dan =
. Syntaknya serupa dengan Python dengan beberapa variasi dari bahasa lain yang belum pernah saya pakai : Ada, Oberon dan Modula.
echo "Hello, UwU" # bukan PHP ya
Record dan Enum
Terdapat juga dukungan Record dan Enum di Nim
type
PlayerBuff = enum
Stealth, Normal, DoubleJump
Player* = object
position*: tuple[int,int]
imagePath: string
buff: PlayerBuff
var hero = Player(
position: (10,10),
imagePath: imagePath,
buff: Normal)
echo hero.imagePath
Penjelasan:
-
type
di Nim untuk bikin tipe data buatan baru. -
Player* = object
ini definisi record/product type,Player
nama recordnya, * artinya dia public danobject
untuk kasih tau kalo type dari Player ini record, kalauenum
dia jadinya enum/sum type - Tab/identasi bekerja seolah kurung yang membatasi pernyartaan atau ekspresi.
Kolleksi
Nim punya cara untuk nyimpen data banyak/jamak. Let say array, sequences, tables dan tuples.
import std/tables
var id : seq[int] = @[1,2,3,4]
echo id[0]
# 1
var name: array[2,string] = ["Yura","Neru"]
echo name[0]
# Yura
var ecs : Table[string,int] = initTable[string,int]()
ecs["Player_HP"] = 100
ecs["Player_MP"] = 50
ecs["Player_Level"] = 2
echo ecs["Player_HP"]
# 30
Penjelasan:
-
seq[int]
, itu namanya sequensial,didalamnya bisa bebas tipe data apa saja tapi untuk contoh kali ini pakaiint
, contoh lainya sepertiseq[string]
,seq[seq[string]]
. sequensial bisa menyimpan nilai dengan ukuran dinamis. -
array[2,string]
, itu namanya membuat array yang akan menampung nilai string sebanyak dua unit. Serupa dengan sequensial hanya saja ukuranya tetap, tidak bisa berubah. -
table
ini merupakan tipa data untuk menyimpan data secara berpasangan, key-value.table[string,int]
berarti key dari table berjenis nilaistring
dengan value yang disimpan berupaint
.
Asynchronous
Terkadang kita perlu fungsi yang jalan tapi bisa entaran dan ga nyetop fungsi yang sedang jalan, ya asynchronous. Di nim ini bakal pakai async/await seperti di javascript dan pragma {.async.}
untuk fungsi.
import std/asyncdispatch
proc UwU(loop: int) {.async.} =
for i in 0..loop:
echo "UwU"
proc OwO(loop: int) {.async.} =
for i in 0..loop:
echo "OwO"
discard UwU(10)
discard OwO(10)
Penjelasan:
-
import std/asyncdispatch
untuk mengambil fungsi dan macro yang berkaitan dengan urusan async seperti pragma{.async.}
, fungsiwaitFor
. -
proc OwO(loop: int) {.async.}
ini kita bikin fungsiOwO
dengan pragma async, tujuan untuk membuat fungsi asynchronous dengan expand macro dari pragma itu. Aslinya fungsi ini ituproc OwO(loop: int) : Future[void]
-
discard
buat ngebuang nilai kembalian dari fungsi yang ga perlu, miripignore
kalo di OCaml.
HTTP Server
Tentu, kita bisa bikin HTTP Server tanpa framework layaknya net/http
punya Go.
import std/asynchttpserver, std/asyncdispatch
# Router callback
proc router(r: Request) {.async.} =
let notFound = r.response(Http404,"not fOwOund")
case r.url.path:
of "uwu":
await r.response(Http200,"UwU")
of "rizzmazz":
case r.reqMethod:
of HttpGet:
await r.response("gyatt")
of HttpPost:
await r.response("skibidi")
else:
await notFound
else:
await notFound
# inisiasi AsyncHttpServer
var server = newAsyncHttpServer()
server.listen(Port(42069))
# notifikasi kalo servernya jalan
let port = server.getPort
echo "httpserver on at localhost:" & $port.uint16
# infinite loop, biar listen koneksi masuk,
# mirip laifsaikel update dan fps
while true:
# kalo ada koneksi masuk, panggil router callback
if server.shouldAcceptRequest():
await server.acceptRequest(router)
else:
await sleepAsync(666)
Penutup
Sekian catatan watashi mengulas tentang Nim. Bahasa ini terbilang enak ditulis namun terkadang juga tak heran pesan error yang lebih horror dari bahasa yang biasanya saya temui.
Ada topik yang rencana saya ingin tambahkan dari Nim yakni tentang Macro, fitur yang membuat ngoding Nim terkadang mudah dan tak heran juga susah, pedang bermata dua.
Referensi Lanjutan
Kredit Gambar
- Gambar Hifumi dari Bluearchive Wiki CC: Nexon & Yostar.
- Gambar Nim oleh Andreas Rumpf
Top comments (2)
sejauh ini klo dibandingkan dengan Lua, prefer yang mana?
masih lua untuk gamedev, ekosistem Nim masih kurang mature ketimbang Lua.