evilfactorylabs

Cover image for Nim Nim: Laporan Belajar Nim
Mabinogion
Mabinogion

Posted on

Nim Nim: Laporan Belajar Nim

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

Penjelasan:

  • type di Nim untuk bikin tipe data buatan baru.
  • Player* = object ini definisi record/product type, Player nama recordnya, * artinya dia public dan object untuk kasih tau kalo type dari Player ini record, kalau enum 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
Enter fullscreen mode Exit fullscreen mode

Penjelasan:

  • seq[int], itu namanya sequensial,didalamnya bisa bebas tipe data apa saja tapi untuk contoh kali ini pakai int, contoh lainya seperti seq[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 nilai string dengan value yang disimpan berupa int.

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)
Enter fullscreen mode Exit fullscreen mode

Penjelasan:

  • import std/asyncdispatch untuk mengambil fungsi dan macro yang berkaitan dengan urusan async seperti pragma {.async.}, fungsi waitFor.
  • proc OwO(loop: int) {.async.} ini kita bikin fungsi OwO dengan pragma async, tujuan untuk membuat fungsi asynchronous dengan expand macro dari pragma itu. Aslinya fungsi ini itu proc OwO(loop: int) : Future[void]
  • discard buat ngebuang nilai kembalian dari fungsi yang ga perlu, mirip ignore 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)
Enter fullscreen mode Exit fullscreen mode

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

Top comments (2)

Collapse
 
rizaldy profile image
Rizaldy

sejauh ini klo dibandingkan dengan Lua, prefer yang mana?

Collapse
 
uccrto profile image
Mabinogion

masih lua untuk gamedev, ekosistem Nim masih kurang mature ketimbang Lua.