Buku Pemrograman Nim

Nim, atau sebelumnya Nimrod merupakan bahasa pemrograman general purpose, system level, optional garbage collector serta memiliki sintaksis mudah dibaca dan elegan. Nim bahasa yang muncul sejak tahun 2006 dan berdiri sendiri tanpa backing dari perusahaan besar, hal ini mengambarkan kekuatan pengembangan yang solid dari Nim.

Buku elektronik ini berusaha mengenalkan Nim dari 0 hingga ke jenjang lanjutan. Ada 3 bagian dari buku ini :

  • Nim Dasar

    Bagian ini membahas topik dasar seperti variable dan tipe data yang cocok untuk kamu yang baru berkenalan dengan programming atau baru mengenal Nim. Kemudian disambung fitur khusus dari nim seperti OOP dan Macros.

  • Web Programmming

    Bagian ini akan mengenalkan pemrograman web dengan Nim. Pustaka yang digunakan yaitu Jester sebagai web framework (serupa framework Sinatra milik Ruby). Selain Jester, akan mengenalkan juga pustaka untuk keperluan database, logging, dan semacamnya.

  • TBD (To be decide)

Lisensi

Buku elektornik ini ini boleh disebarluaskan secara gratis berdasarkan aturan lisensi CC BY-NC-SA 4.0.

Penulis

Buku ini ditulis oleh Yoghaswara "artileda" Hadi Nugroho. Bila ada pertanyaan atau saran, bisa membuat issue baru di https://github.com/artileda/artileda/issues/new.

Informasi terkait Nim

Panduan Baca Buku

Panduan membaca buku ini

Buku ini memiliki idiom penulisan tertentu yang dirasa tidak umum atau membingungkan, halaman ini dibuat untuk memberikan panduan terhadap idiom dan rambu-rambu yang ada didalam buku ini.

  • Tulisan miring, tulisan dibuat miring karena kata asing atau serapan tertentu.

  • Tulisan mono, tulisan ini dibuat untuk merujuk pada kode atau hal teknis pemrograman lainya.

  • Tulisan tebal, tulis ini dibuat untuk merujuk kepada bagian lain dari buku ini.

  • Markah Mono

      Tulisan ini dibuat untuk mengambarkan kode yang panjang ke bawah.
    
  • Markah biasa

    Tulisan ini dibuat untuk menunjukan informasi penting yang dibuat menonjol agar tidak terlewat.

Rambu dalam markah kode

  • Placeholder (Ruang pengganti)

    Placeholder adalah ruang dimana pembaca diharapkan menukarnya tulisan tersebut dengan maksud penulis.

    Seperti ini:

    let <nama> : <tipe data> = <nilai>
    

    Rambu <nama>, <tipe data> dan <nilai>, penulis bermaksud untuk pembaca saat mempraktikan atau membaca menganggap rambu ini bisa diubah dengan nilai bebas tertentu sesuai dengan maksud yang ditulis didalam kurung siku.

    let angkaPI : float = 3.14
    

Nim Dasar

Seksi ini akan membahas pemrograman fundamental dari 0 dan di ikuti oleh pengenalan fitur khusus yang dimiliki oleh Nim.

Belajar Nim

Nim (sebelumnya Nimrod) merupakan bahasa pemrograman general-purpose dan multi-paradigma yang dikembangkan oleh Andreas Rumpf sejak tahun 2006.

Desain bahasa terinspirasi dari bahasa Python, Ada dan Modula, maka tak heran Nim banyak dijuluki dengan pesaing Python.

Nim mengompilasi source code Nim ke dalam bahasa C, C++ atau Javascript sehingga dapat membentuk bineri native executable atau source code Javascript.

Logo resmi Nim

Logo Resmi Nim

Kelebihan Nim

  • Syntaks yang mudah dibaca dan flexible.
  • Kompiler Nim berkerja pada platform sistem operasi mayoritas : Windows, MacOs dan Linux.
  • Penanganan memori deterministik dan bisa di kustom, cocok untuk embedded system dan sistem real-time.
  • Mendukung transpilasi ke bahasa C, C++ dan Javascript. Kompilasi ke C atau C++ memberi dukungan lebih untuk menjangkau arsitektur instruksi CPU yang bervariasi.
  • Tipe Statis mengeliminasi _run-time error _menjadi compile-time error.

Ease Syntax + High-perfomance = Nim

Install Nim

Nim mendukung sistem operasi Windows , Mac dan Linux. Distribusi instalasi Nim bisa dilihat di Download Nim.

Install Nim di Windows

  • Buka situs Download Nim, pilih Windows
  • Unduh arsip, pilih Download x86_64.zip.
  • Setelah selesai di unduh, extract zip ke drive C:\nim (buat dulu foldernya) lalu masuk ke folder yang diekstract dan jalankan finish.exe.
  • Agar nim bisa dijalankan lewat terminal, tambahkan ini ke enivroment variabel (Caranya disini), lalu tambahkan keakhir nilai variabel PATH : C:\nim\bin dan %USERPROFILE%\.nimble\bin. Jadi seperti ini <nilai yang udah ada>;C:\nim\bin;%USERPROFILE%\.nimble\bin.

Install Nim di Linux

  • Buka situs Download Nim, pilih Linux.
  • Unduh arsip, pilih Download x86_64.zip.
  • Ekstrak folder ke /home/<hostname komputer kamu>/nim.
  • Lalu tambahkan nilai /home/<hostname komputer kamu>/nim/bin dan /home/<hostname komputer kamu>/.nimble/bin environment variabel PATH agar bisa menjalankan Nim lewat terminal.
    • tambahkan PATH=$PATH:/home/<hostname komputer kamu>/nim/bin:/home/<hostname komputer kamu>/.nimble/bin ke file /etc/profile, atau bisa tambahkan ke /home/<hostname komputer kamu>/.bashrc bila menggunakan bash.

Install Nim di Android

  • Menjalankan Nim di android bisa menggunakan Termux (download dari situs F-droid resminya karena yang di - PlayStore sudah tidak dirawat).
  • setelah install, jalankan ditermina pkg upgr untuk memperbaharui internal termux.
  • terakhir pkg install nim.

Untuk menjalankan sebuah kode Nim

  • Buat sebuah file bernama main.nim (nama main ini hanya contoh).

  • Isi didalamnya kode berikut

    echo "UwU" 
    
  • lalu buka terminal dan masuk ke folder dimana file main.nim berada (gunakan cd untuk berpindah folder di terminal).

  • kemudian jalankan perintah nim c -r <nama file>, untuk kasus ini nim c -r main.nim. Maka akan muncul UwU.

  • Bila ingin mengompile binary saja tanpa menjalankan bisa hapus flag -r, lalu jalankanya binarynya dengan ./main (main sesuai dengan nama file)

Ini bukan cara satu-satunya untuk menginstall Nim, ada cara lain yaitu mengompilasinya dari kode sumber atau menggunakan choosenim.

Persiapan Editor

Code editor untuk memrogram Nim bisa mengunakan Visual Studio Code, Vim dan Notepad++

Visual Studio Code (VSCode)

  • Pencet ctrl + shift + x untuk membuka sisi Extension.
  • Ketik di search bar nim,maka akan muncul pilihan ektensi (pastikan terkonesi ke internet).
  • Pilih ektensi nim dengan unduhan terbanyak (sejauh ini ekstensi milik Konstantin Zaitsev).

Ektensi adalah fitur tambahan yang terpisah dari code editor, pemisahan ini agar pengguna tidak telalu berat mengunduh code editor dan menyesuaikan dengan kebutuhan code editor.

Vim

Pro-tips: Bila kamu memrogram menggunkan komputer/laptop bisa menggunakan VSCode, bila menggunakan Termux Android pilih Vim (tidak terbatas untuk Android).

Simple Program: Hello World

Program adalah kumpulan instruksi komputer yang menerima nilai masukan dan menghasilkan nilai keluaran.

Nilai masukan merupakan sebuah nilai yang berasal dari perangkat masukan komputer seperti ketikan,file eksternal atau paket jaringan.

Nilai keluaran adalah nilai yang dihasilkan ketika program diberi nilai masukan, seperti menampilkan tulisan, memutar suara/video dan megiriman paket jaringan.

Hello Word

Hello Word merupakan contoh program sederhana yaitu nampilkan kata ke layar (nilai keluaran) pada program.

echo("Hello, World")
# echo "Hello, World"
# ^ tanpa kurung juga bisa

Kata kunci echo, berguna untuk menampilkan nilai ke layar.

Reflek

Bagian ini akan mencontohkan bagaimana program menerima nilai masukan dari keyboard dan mengeluarkanya kelayar (reflek).

echo readLine(stdin)

Kata kunci readLine() berfungsi untuk membaca file dan variabel stdin (standard input) untuk menerima karakter yang kita ketik ke layar.

Membuat dialog sederhana

Sampai tahap ini kita telah belajar tentang echo dan readLine(stdin), sekarang kita membuat dialog antara komputer dengan kita menggunakan kata kunci yang telah kita pelajari.

echo "Hai, nama kamu siapa ?"
echo "Halo, " & readLine(stdin) & ". Salam kenal."

Variabel

Variabel adalah tempat program menyimpanan nilai sementara di memori komputer, setelah program mati atau komputer mendadak mati maka nilai ini akan hilang.

Tujuan variabel untuk menyimpan nilai sementara dari proses perhitungan atau komputasi yang akan digunakan oleh proses lain agar tidak melakukan perhitungan yang sama dua kali.

Cara membuat (deklarasi) variabel program kita bisa menggunakan kata kunci var ataupun let.

Kata kunci var

Membuat dengan kata kunci var (singkatnya, Variabel var) memiliki aturan pola kalimat seperti ini.

var [nama variabel] : [tipe data] = [nilai]

Deklarasi variabel di awali dengan kata kunci var, kemudian diikuti dengan [nama variabel]. Nama variabel berguna untuk mengambil nilai yang di simpan dalam variabel.

Nama variabel ini bebas kita berikan bisa test1 atau umur, penamaan yang baik yaitu menamakan sesuai denga data yang disimpan di dalam variabel.

[tipe data], Tipe data memberi tahu komputer bahwa nilai yang disimpan memiliki tipe data tertentu untuk menentukan bagaimana nilai yang di simpan akan di proses.

[nilai] merupakan nilai yang akan di simpan seperti angka, karakter, notasi logika atau data objek.

Contoh deklarasi dan pemakaian variabel kata kunci var :

var nama : string = "Andrea"
echo nama 
# Andrea

Pro-tip: tipe data string adalah jenis tipe data yang menyimpan nilai karakter.

Kita bisa mengubah nilai variabel dengan mengunakan simbol =, karena variabel var bersifat mutable (bisa berubah/mutasi).

var nama = "Andrea"
echo nama 
# Andrea

nama = "Rumpf"
echo nama

Kata kunci let

Selain var, kata kunci let juga bisa digunakan untuk mendeklarasikan variabel dan polanya tidak jauh berbeda dengan pola kalimat kata kunci var.

let [nama] : [tipe data] = [nilai]

Contohnya seperti ini

let nama = "Andrea"
echo nama 
# Andrea

nama = "Rumpf"
# [ERROR]

Pro-tips : Variabel let tidak bisa diubah nilainya setelah dideklarasikan.

Quest: Program dialog

Dibagian sebelumnya, kita telah belajar membuat dialog sederhana. Tetapi apa yang bisa kita pakai dari pelajaran ini untuk membuat mengembangkan program dialog sederhana ?

Kita bisa memanfaatkan variabel untuk menyimpan nilai masukan dari pengguna untuk disimpan kemudian ditamplikan dalam bentuk yang besar, seperti ini:

echo "Siapa nama kamu ?"
let nama : string = readLine(stdin)
echo "Hai, " & nama & ". senang bisa berkenalan."
echo nama & ", mau nanya dong. umur kamu berapa ?"
let umur : string = readLine(stdin)
echo "Oke, Terima kasih " & nama
echo "Nama kamu " & nama & " dan berumur " & umur

Dengan variabel, kita bisa menggunakan jawaban dari Siapa nama kamu ? berulang kali tanpa menanyakan lagi.

Tipe data

Setiap nilai memiliki tipe datanya tersendiri yang menentukan bagaimana nilai akan diproses di dalam program.

Nilai yang disimpan di dalam komputer berbentuk byte dan penyimpan berbeda untuk bentuk nilai tertentu, maka tipe data memudahkan kita untuk mengambil dan memroses nilai yang disimpan.

Info: Nim adalah bahasa yang tipe bersifat statis, tipe perlu di tulis saat deklarasi variabel dan tidak pernah berubah setelahnya.

Tipe data dibagi menjadi 2 yaitu tipe data primitif dan tipe data buatan.

Tipe data primitif

Tipe data ini yang paling dasar dan tidak ada turunanya lagi.

NamaPenulisanDeskripsi
IntegerintTipe data ini untuk nilai angka seperti 1,3,-20
FloatfloatTipe data ini untuk nilai bilang pecahan seperti -1.32,3.14
StringstringTipe data ini untuk nilai kumpulan karakter seperti "Nim keren", "Hello, World"
BoolboolTipe data ini untuk nilai logika seperti True dan False
CharcharTipe data ini untuk karakter tunggal seperti 'a','\n'

Berikut contohnya :

var umur : int = 26
var beratBadan : float = 52.3
var nama : string = "Gwen Adler"
var menikah : bool = false
var inisial : char = 'a'

Tipe data buatan

Tipe data ini hasil dari tipe yang kita deklarasi sendiri (pembahasan lebih lanjut di Enum dan Record). Tipe data buat kita bisa membuat gabungan tipe dari tipe dasar (tipe data komposit) atau tipe data dengan nilai khusus (tipe data enumerasi).

type StatusDaring* = enum 
	online | sibuk | idle | offline

type GithubAcc = object
	username* string
	status* StatusDaring


var akunKeren = GithubAcc(username: "artileda",status: StatusDaring.Sibuk)

Pro-tips : Nim bisa mengetahui tipe data dari nilai yang diberikan (Hindley-Milner type inference). Hal ini berguna untuk menghindari penulisan tipe yang berulang.

Operator

Operator merupakan cara kita untuk mengoperasi sebuah nilai untuk diproses, ini alasan kenapa kita belajar tipe data sebelumnya karena operator sangat bergantung kepada tipe data sebuah nilai.

Ada tiga bentuk operasi dasar dalam program : aritmatika, relasional dan logika.

Aritmatika

Operasi ini berurusan dalam perubahan angka seperti penjumlahan, pengurangan dan sebagainya. Tipe data yang dioperasikan yaitu Integer dan Float.

Nama OperasiSimbolContohnya
Penjumlahan+32 + 1, 3.14 + 0.86
Pengurangan-2 - 1, 0.143 - (-1.33)
Perkalian*432 * 200, 1.0 * 0.44
Pembagian\4.0 / 0.23, 6 / 3

Contoh penerapan

3 + 2 
# 5

5 - 1
# 4

Parentesis

Parentesis atau kurung () merupakan operasi untuk mendahulukan perhitungan didalamnya. contohnya seperti ini:

3 - ( 4 + 2 )
# 3 - 7 = -4 

(3 - 4) + 2 
# -1 + 2 = 1

Relasional

Operasi ini membandingkan nilai dan mengembalikan nilai logika. Jika perbandingan benar maka akan mendapat nilai true, bila salah maka mendapat nilai false. Sebagian operasi ini mendukung hampir semua tipe dasar.

Nama OperasiSimbolTipe dataContohnya
Sama dengan==Integer, Float, String, Boolean, Char2 == (1 + 1) , "UwU" == "uWu", true == ( 1 == 1 )
Tidak sama dengan!=Integer, Float, String, Boolean, Char2 != 1 , "UwU" != "uWu", true == ( 1 != 1 )
Kurang dari<Integer, Float1 < 2, 0.3 < 0.4
Lebih Dari>Integer, Float3 > 2, 2.3 > 0.3
Kurang dari sama dengan<=Integer, Float4 <= 3, 0.3 <= 1.0
Lebih dari sama dengan>=Integer, Float3.3 >= 3.2, 3 >= 5

Logika

Operasi ini bertugas untuk merubah data logika, seperti boolean.

Nama OperasiSimbolContohnya
Logika ANDand true and false
Logika ORortrue or false
Logika NOT!!true

Logika AND akan mengembalikan nilai false bila disalah satu sisi ada dan kedua sisi bernilai false.

Logika OR, serupa dengan Logika AND tetapi untuk nilai true.

Logika NOT, membalik nilai logika bila logika NOT ada pada nilai true maka berubah menjadi false dan kebalikanya.

Pemilihan Kondisi

Pemilihan kondisi adalah cara menjalankan baris kode dengan dibatasi oleh kondisi dari nilai ataupun operasi.

Jadi suatu kode akan dijalankan bila ada kondisi pemilih tertentu saja, sebelumnya kita hanya menjalankan kode terus mengalir dari atas kebawah tanpa terlewat menjalankan kode satupun.

Ada 2 cara untuk membuat pemilihan kondisi, menggunakan pernyataan if yang berdasarkan logika atau pernyataan case yang berdasarkan kecocokan nilai.

Pernyataan if

Deklarasi pemilihan dapat mengunakan kata kunci if dengan pola kalimat seperti ini

if <kondisi pembatas>:
  <baris kode yang dijalankan bila kondisi pembatas bernilai benar>

Contoh seperti ini:

let hujan = false

if hujan:
  echo "Malam akan hujan, jangan lupa bawa payung."
  # ini tidak akan dijalankan

Contoh diatas mengambarkan kata kunci echo tidak dijalankan karena variabel hujan tidak bernilai true yang menandakan bahwa kondisi pembatas terpenuhi.

Silahkan coba kode di atas dan di bawah ini untuk melihat perbedaanya.

let hujan = true

if hujan:
  echo "Malam akan hujan, jangan lupa bawa payung."

Pernyataan if-else

Pernyataan if memiliki lanjutanya lainya yaitu keyword else. Keyword else bertugas menjalankan baris kode yang tidak memenuhi kondisi pembatas penyataan if diatasnya.

Contoh seperti ini :

let hujan = false

if hujan:
  echo "Malam akan hujan, jangan lupa bawa payung."
else:
  echo "Malam tidak hujan"
  # ini akan dijalankan

Pernyataan if-elif

Kata kunci elif berguna untuk menyambung kondisi pembatas sebelumnya dengan kondisi pembatas baru, berbeda dengan else yang tidak memiliki kondisi pembatas.

Contoh sebelumnya kita mengunakan nilai kondisi bersifat biner, sekarang kita coba dengan nilai kondisi yang bersifat skalar (memiliki ukuran).

let suhu = 30

if suhu <= 25:
  echo "Ruangan ini dingin"
elif (suhu >= 26) and (suhu <= 30):
  echo "Ruangan biasa saja"
elif suhu >= 31
  echo "Ruangan ini panas"

Kondisi pembatas diatas membandingkan variabel suhu apakah kurang dari sama dengan 25, bila benar maka menampilkan Ruangan ini dingin.

Kondisi kedua kita berhadapan dengan kondisi pembatas tertutup yang berarti kondisi ini terjadi dalam nilai tertentu dalam kasus ini antara 26 sampai 30. Kondisi ini memiliki tiga operasi yaitu

  1. lebih dari sama dengan 26
  2. kurang dari sama dengan 30
  3. logika AND dari hasil poin 1 dan poin 2

Pertama kita, lihat apakah variabel suhu lebih 26, bila benar maka poin 1 bernilai true. Kedua, kita uji lagi variabel suhu apakah kurang dari 30, bila benar maka poin 2 bernilai true. Terakhir, kita menguji apakah Logika AND dari nilai point 1 (true) dan point 2 (true). Masih ingat logika AND yang dibahas di bagian Operator ?

Kondisi ketiga mengcek apakah variable suhu lebih dari 31.

Kuis

  • Apa hasil dari contoh kode pernyataan elif jika dijalankan dengan kondisi ke-3 dihapus dan nilai variabel suhu dideklarasikan dengan nilai 31 ?

  • Apa yang berbeda jika kedua kode ini dijalankan ?

    let umur = 18
    
    if umur >= 18:
      echo "Masa remaja akhir"
    
    if umur >= 21:
      echo "Masa awal dewasa"
    
    let umur = 18 
    
    if umur >= 18:
      echo "Masa remaja akhir"
    elif umur >= 21:
      echo "Masa awal dewasa"
    

Pemilihan Kondisi dengan Pernyataan case

Pada bagian sebelumnya, pemilihan kondisi dengan pernyataan if menggunakan basis logika sebagai kondisi pembatasnya. Pernyataan case merupakan pemilihan kondisi yang berdasarkan ke cocokan nilai dan pola sebagai pembatasnya. Berikut pola kalimat penulisan pernyataan case :

case <nilai/variabel yang diuji>:
  of <kondisi pembatas>:
    <baris kode>
  of <kondisi pembatas>:
    <baris kode>
  # Kondisi lainnya
  else:
    <baris kode>

Pernyataan diawali dengan kata kunci case kemudian dibarengi dengan nilai atau variabel yang ingin diuji dengan kondisi pembatas dibawahnya. Kata kunci of berguna untuk mendeklarasikan kondisi pembatasnya, jika nilai / variabel uji memiliki nilai sama dengan kondisi pembatas ini maka baris kode didalamnya akan dijalankan dan pemilihan kondisi berakhir.

Kata kunci else serupa dengan pernyataan if, dijalankan bila tidak ada kondisi pembatas diatasnya yag terpenuhi.

Contoh seperti ini:

let statusWhatsapp : int = 3

case statusWhatsapp:
  of 0:
    echo "Ada"
  of 1:
    echo "Sibuk"
  of 2:
    echo "Sedang rapat"
  of 3:
    echo "Tidur"
  else:
    echo "Status tidak diketahui"

Perulangan

Perulangan serupa dengan memiliki pemilihan kondisi yaitu memiliki kondisi pembatas, tetapi berbedaanya perulangan bertugas untuk menjalankan baris kode berkali-kali selama kondisi pembatas masih terpenuhi sedangkan pemilihan hanya menentukan baris kode mana yang akan dijalankan.

Ada dua jenis perulangan yaitu looping dan iterasi. Looping menggunakan kondisi pembatas berdasarkan logika seperti pernyataan if. Iterasi mengunakan isi koleksi data sebagai kondisi pembatas yang akan dibahas lebih lanjut pada bagian Koleksi.

Nim memiliki pendekatan first class iterators, karena Nim mendukung iterasi inline dan iterasi klosure

Looping

Deklarasi sebuah looping pada Nim menggunakan pernyataan while.

while <kondisi pembatas>:
  <baris kode>

Contoh seperti ini:

var index = 0 

while index < 5:
  echo index
  index += 1 
  # bentuk ringkas dari 
  # index = index + 1

Kode diatas kita memiliki variabel index bernilai 0 lalu sebuah kondisi perulangan dengan batas nilai variabel index kurang dari 5. Jika nilai variabel index kurang dari lima, maka perulangan akan menjalankan baris kode dibawahnya yaitu

  echo index
  index += 1

echo index bertugas menampilkan nilai variabel index, variabel index disini berkerja sebagai pembatas kondisi perulangan. index += 1 berfungsi untuk mengubah nilai variabel index agar membuat nilai variabel index melewati kondisi pembatas yaitu angka yang lebih kecil dari 5, jika kondisi pembatas terlewati, maka perulangan berhenti.

Peringatan: Kondisi pembatas looping sebaikanya menguji variabel mutable untuk mententukan batas operasi, karena looping bisa dihentikan dari dalam baris kode dengan mengubah nilai variabel. Bila tidak ada kemungkinan infinite loops, yang menyebabakan program membuat komputer menjadi hang karena perulangan tidak berhenti dapat menghabiskan resource komputer seperti RAM penuh atau CPU 100%.

Kata kunci break

Ada kalanya kita perlu berhenti dari perulangan tanpa harus memenuhi kondisi pembatas, di sini peran dari kata kunci break untuk menghentikan perulangan.

var index = 0

while true:
  if (index >= 0) and (index < 10):
    echo index
    index += 1
  else:
   break
		

Peringatan: contoh ini mengunakan infinite loops dimana kondisi pembatas tidak pernah berubah karena menggunakan nilai langsung yang tidak bisa diubah.

Contoh infite loop diatas bisa ditangani dengan mengehentikan perulangan pada kondisi tertentu, kasus diatas ingin menampilkan nilai 0 sampai 10 dari infinite loop.

Engineering tips: Meskipun infinite loop terkesan mengerikan, tetapi memiliki kegunaan tersendiri seperti membuat event loop pada web server atau program yang memiliki tugas menunggu.

Iterasi

Nim memiliki fitur iterator yang unik, tetapi disini hanya akan membahas penggunaan yang sederhana yaitu Pernyataan for. Pola pernyataan for sebagai berikut

for <item> in <koleksi data>:
  <baris kode>

item adalah nilai yang ditelusuri oleh program jadi semua nilai dari <koleksi data> akan dibaca melalui index oleh baris kode dibawahnya, nama index bebas seperti variabel.

for angka in [1,3,4,5]:
  echo angka

Kapan pakai Looping dan iterasi ?

Penggunaan looping digunakan pada saat kondisi banyak bergantung pada operasi logika seperti mengurutkan data atau proses yang tidak menggunakan data secara langsung (sebagai contoh event loop).

Iterasi digunakan untuk kondisi yang bergantung pada koleksi data seperti ingin mengubah isi koleksi keseluruhan atau sebagian atau mencari data.

Koleksi

Koleksi adalah tipe data dengan kumpulan nilai. Pada contoh variabel sebelumnya kita hanya bisa menyimpan satu nilai (nilai tunggal) didalam variabel, dengan koleksi kita bisa menyimpan banyak nilai (nilai majemuk) yang diakses menggunakan index posisi yang dimulai dari 0 dan tipe data nilai yang disimpan dalam satu koleksi harus sama

let tunggal = 12
let majemuk = [1,2,3]

echo tunggal # 12

echo majemuk[0] 
# membaca index ke-0 
# dari varibel majemuk
# 1

echo majemuk[1] 
# sama seperti diatas 
# tapi index ke-1
# 2

Koleksi pada Nim terdapat 3 jenis : Array, Sequence dan string.

Koleksi Array

Array (dibacai arai) merupakan jenis koleksi yang menyimpan banyak data dengan jumlah yang tetap, artinya setelah dideklarasikan bersama jumlahnya ukuran tidak bisa bertambah.

let <nama> : array[<ukuran array>, <tipe data>] = [<nilai>,<nilai>]

# atau untuk deklarasi nilai berbentuk array

[<nilai>,<nilai>]

Contohnya seperti ini:

let isiDompet : array[2, string] = ["KTP","KTM"]

echo isiDompet[0] 
# KTP
echo isiDompet[1]

contoh diatas kita mengakses nilai dari isiDompet menggunakan index posisi:

IndexNilai
0KTP
1KTM

Looping dan Iterasi pada Koleksi

Untuk memroses isi koleksi akan cukup melelahkan bila kita menulis kode yang sama berulang untuk mengakses isi koleksi. Kita bisa gunakan perulangan yang sebelumnya telah dibahas:

let isiDompet : array[2, string] = ["KTP","KTM"]

# pendekatan _looping_
var index = 0
while index < 2:
  echo isiDompet[index]
  index =+ 1

# pendekatan iterasi
for isi in isiDompet:
  echo isi

Koleksi Sequence

Sequence (dibaca sekuens) merupakan jenis koleksi menyimpan banyak nilai dengan ukuran yang bisa berubah, artinya isi bisa bertambah atau berkurang, hal yang berkebalikan dengan Array.

Pola deklarasi sequence:

var <nama> : seq[<tipe data>] = @[<nilai>,<nilai>]

# atau untuk deklarasi nilai berbentuk sekuens

@[<nilai>,<nilai>]

Contoh seperti ini:

var isiDompet : seq[string] = @["KTP","KTM"]

Karena sekuens bisa diubah, kita bisa menambahkan data yang akan masuk ke posisi akhir koleksi mengunakan metod add milik tipe data sekuens. Metod add membutuhkan argumen nilai, add(<ini argumen>) yang sesuai dengan tipe data nilai di dalam sekuens.

var isiDompet : seq[string] = @["KTP","KTM"]

echo isiDompet
# @[KTP , KTM]

isiDompet.add("Rp. 10000")

echo isiDompet
# @[KTP,KTM,Rp. 10000]

Contoh kode diatas kita bisa kita lihat isiDompet bertambah satu elemen baru yaitu Rp. 10000. Jika kita gambarkan tabel index posisi dan nilai maka akan sepert ini:

IndexNilai
0KTP
1KTM
2Rp. 10000

Misalkan Rp. 10000 ingin kita hapus dari variabel isiDompet (anggap uangnya dipakai), kita bisa menggunakan metod delete. Metod delete menghapus isi sekuens berdasarkan index posisinya.

var isiDompet : seq[string] = @["KTP","KTM"]

echo isiDompet
# @[KTP , KTM]

isiDompet.add("Rp. 10000")

echo isiDompet
# @[KTP,KTM,Rp. 10000]

isiDompet.delete(2)

echo isiDompet 
# @[KTP,KTM]

Sekuens memiliki ukuran yang berubah-ubah bagaimana cara kita untuk tahu berapa ukuran sebuah sekuens ? caranya menguankan metod len, metod len berguna untuk mengetahui berapa banyak isi nilai dari sekuens.

var nama = @["Anya","Bella"]
nama.add("Citra")
nama.add("Delia")
nama.add("Elsa")

echo nama.len()
# 5

Peringantan: Sequence bersifat mutable, penggunanya harus mengunakan kata kunci var

Sub-Program

Sub-program merupakan cara menuliskan sebuah baris kode untuk dipanggil berulang kali tanpa perlu menulis baris kode yang sama berulang kali, Sub-program membuat penyusunan program menjadi terstruktur dan memecah baris kode sesuai kegunaanya untuk dipakai kembali.

Sub-program dibagi menjadi dua yaitu Prosedur dan Fungsi.

Berikut contoh sederhana dari penerapan sub-program.

  • Tanpa Sub-program

    let dompet = ["KTP","KTM","Poto pacar"]
    
    var bawaKTP = false
    for isi in dompet:
      if isi == "KTP":
        bawaKTP = true
    
    var bawaKTM = false
    for isi in dompet:
      if isi == "KTM"
        bawaKTM = true
    
    echo bawaKTP
    # true
    echo bawaKTM
    # true
    
  • Sub-program

    let dompet = ["KTP","KTM","Poto pacar"]
    
    func bawa(barang : string,di: []string) : bool =
      for isi in di:
        if isi == barang:
          return true
      return false
    
    echo bawa("KTP",dompet)
    # true
    echo bawa("KTM",dompet)
    # true
    

Prosedur

Prosedur adalah kumpulan baris kode yang dibungkus dengan nama dan parameter, parameter prosedur adalah nilai yang diberikan untuk diproses oleh kumpulan baris kode didalamnya. Berikut pola kalimat prosedur :

proc <nama prosedur> (<nama parameter> : <tipe data prosedur>,...) : <tipe data kembalian> =
  <barik kode prosedur>

Contoh seperti ini:

proc rumuSegitiga(alas: int, tinggi: int) : float =
  return (alas * tinggi) / 2

echo rumuSegitiga(4,3)
# 6

Prosedur tidak mewajibkan kita untuk untuk membuat nilai kembalian dan bisa merubah nilai di luar prosedur, ini kebalikanya dengan satu sub-program lain : Fungsi.

var hasil = 0
proc rumuSegitiga(alas: int, tinggi: int)=
  hasil = (alas * tinggi) / 2

rumuSegitiga(4,3)
echo hasil
# 6

Enumerasi

Enumerasi atau disingkat enum adalah tipe data buatan yang nama dan elemen nilainya kita tentukan sendiri Sebagai contoh tipe data boolean hanya menampung nilai true dan false, tetapi kita ingin sebuah tipe data serupa dengan boolean tetapi memiliki nilai baru yaitu unknown, maka kita bisa membuat tipe data baru dengan enum.

Pola kalimat untuk mendeklarasikan enum:

type
  <nama enum> = enum
   <nilai enum> , <nilai enum>

Berikut contoh penerapanya pada tipe data boolean dengan unknown kita beri nama ubool:

type
  ubool = enum 
   false, true , unknown

Penggunaan nilai tipe ubool dalam sebuah kasus:

type 
  ubool = enum
    false, true, unknown

var tesUbool : ubool = false
echo tesUbool
# false 

tesUbool = true 
echo tesUbool
# true

tesUbool = unknown
echo tesUbool
# unknown

Record

Record adalah tipe data buatan yang berisi kumpulan tipe data lain yang disebut field, seperti koleksi tetapi untuk isi tipe data.

Record pada Nim lebih dikenal dengan nama Object, penggunaan kata record hanya untuk pembaca familiar dengan istilah ini.

Pola deklarasi Record:

type 
  <nama record> = object
    <nama field>:<tipe field>
    <nama field>:<tipe field>
    ...

Contoh deklarasi Record dan penulisan nilai dengan Record.

type 
  Gender = enum
    pria | wanita | nonbiner

  Biografi = object
    nama : string
    umur : int
    jenisKelamin Gender


var el = Biografi(nama: "Elisabeth Kartini", umur: 22, jenisKelamin: wanita)

echo el.Nama
# Elisabeth Kartini 

echo el.umur
# 22

echo el.jenisKelamin
# wanita

Notasi . (titik/dot) pada variabel el dan nama field dari tipe data Biografi digunakan untuk mengakses nilai dari field tipe data tersebut.

Isi dari field bisa diubah dengan operator =.

# ... nyambung dengan contoh kode yang diatas

echo el.Nama
# Elisabeth Kartini 

el.Nama = "Maria Hoshinova"

echo el.Nama
# Maria Hoshinova

Peringatan: setiap variabel yang ingin di ubah sewaktu-waktu, deklarasikan dengan kata kunci var

File Eksternal

Bagian ini akan membahas bagaimana program membaca isi file komputer (file yang berada di eksplorer contohnya) dengan program. Ini membantu kita untuk menyimpan nilai ke sebuah file dan mengambilnya lagi, karena semua nilai yang kita simpan di variabel akan hilang ketika program mati atau komputer menadak mati maka ini salah satu cara untuk mengatasi keterbatasan tersebut.

Membaca isi file

fungsi readLine digunakan untuk membaca file dengan argumen berupa string berisi lokasi file di hardisk yang ingin dibaca.

Sebelum mengikuti contoh ini buat file test.txt berisi ini dari file, kemudian buat kode dibawah ini ditempat yang sama dengan test.txt.

let iniFile = readLine("./test.txt")
echo iniFile
# ini dari file

./ berarti lokasi sekarang dari program yang dijalankan, jika mau membaca file yang berada jauh di folder atau hardisk lain bisa gunakan lokasi seperti pada eksplorer (C:\User\public\Documents\test.txt untuk Windows atau /home/user/test.txt untuk Linux dan Mac)

fungsi writeLine digunakan untuk menulis nilai ke file, fungsi writeLine memerlukan argument berupa nilai string berisi lokasi file yang ingin ditulis dan nilai yang ingin ditulis.

let isiFile = "ini dari dalam file"
let path = "./test_tulis.txt"

writeLine(path, isiFile)
# kita cek isi filenya

echo readLine(path)
# ini dari dalam file

Pembuatan sebuah file bergantung kepada akses yang diberikan oleh sistem operasi kepada pengguna yang menjalankan program, hal ini bisa menyebabkan kegagalan penulisan dan pembacaan file karena hal ini atau filesystem dilokasi penulisan bersifat read-only

Object-Oriented Programming (OOP)

Nim mendukung multi paradigma seperti fungsional dan OOP. Object-oriented programming atau dalam bahasa indonesia pemrograman berorientasi objek adalah pola pemrograman yang mengabungkan record dan fungsi menjadi kedalam satu ikatan yang disebut objek.

Objek juga termasuk kedalam bentuk tipe data buatan, setiap deklarasi dan isinya kita yang menentukanya. Objek dibuat dengan adanya kelas (class), kelas berisi deklarasi fungsi (disebut metod) dan variabel dari field record (disebut attribut) yang akan digunakan untuk digunakan oleh objek.

  • Record biasa

    type
      <nama record> = object
        <nama field>:<tipe data field>
        ....
    
  • Sebuah definisi record dengan objek

    type
      <nama objek> = object
        <nama atribut>:<tipe data field>
        ....
    
    proc <nama metod> : (this: <nama objek>) =
      <baris kode metod>
    

Contohnya seperti ini :

type 
  Orang = object
    nama: string
    umur: int

proc echo(this: Orang) =
  echo this.nama
  echo this.umur

proc siapaYangLebihTua(this: Orang, lain: Orang) =
  if this.umur > lain.umur:
    echo this.nama & " lebih tua dari " & lain.nama
  else:
    echo lain.nama & " lebih tua dari " & this.nama

Contoh diatas sebuah kelas Orang memiliki atribut nama danumur lalu metod bernama echo dan siapaYangLebitTua.

Bukanya ini hanya Record dan Procedure/Fungsi biasa ? Benar begitu lah cara melakukan OOP di Nim, berikut ini cara pakainya:

let anya = Orang(nama: "Anya", umur: 21)
let elsa = Orang(nama: "Elsa", umur: 18)

anya.echo()
elsa.echo()

anya.siapaYangLebihTua(elsa)

Jadi tidak ada istilah khusus yang digunakan untuk membuat kelas di Nim, cukup dengan sebuah Record dan Sub-program yang menjadikan tipe data record tersebut sebagai parametenrnya.

Fun-fact: Record dikenal dengan object di Nim dan bisa disebut sebagai object tanpa kelas.

Paket Manajer Nimble

Nim punya paket manajer bernama Nimble, paket manager membantu kita untuk membuat pustaka sendiri dan mengatur projek berisi kode yang kita tulis (disebut codebase). Bagian ini akan membahas bagaimana membuat proyek kode dengan Nimble.

Pustaka (Library) adalah kumpulan kode yang dibuat untuk digunakan oleh program atau proyek lain, sedangkan Proyek adalah kumpulan kode kita yang diatur ke dalam bentuk proyek untuk mudah menjalankan kumpulan kode sumber sekaligus.

Cara memakai Nimble

Nimble tersedia langsung saat kita menginstall Nim, untuk mengecek nimbel dapat mengetikan nimble di terminal (kalau di Windows, Command Prompt). Nimble punya banyak perintah dan flags untuk pemakaianya, maka tabel berikut berisi cheetsheet untuk mengenali penggunaan nimble :

PerintahContohKeterangan
initnimble initMembuat pustaka dan proyek dengan Nimble akan muncul dialog teks interaktif untuk prosesnya
buildnimble buildMemgompile proyek Nimble
runnimble runMenjalan entrypoint proyek yang dibuat dengan Nimble
installnimbel install <nama pustaka>, nimble install jesterMemasang pustaka global, jadi pustaka ini bisa dipakai oleh program tunggal, proyek dan pustaka
uninstallnimble uninstall <nama pustaka>,nimble uninstall jesterMenghapus pustaka yang terinstall di lokal installasi Nim
searchnimble search <nama pustaka>,nimble search jesterMencari pustaka didalam installasi Nim

Peringatan : perintah run dan build hanya bisa dijalan di dalam folder proyek Nimble. Caranya masukan terminal ke folder proyek nimble dan jalankan perintah ini.

Membuat Proyek/Pustaka dengan Nimble

Buat folder nim bebas dimana (boleh di drive D: atau /home/user/) untuk praktik kali ini kemudian buka terminal dan masuk ke folder nim. Berikut langkah untuk membuat projek/pustaka sederhana dengan Nimble:

  • Buat folder dengan nama projek/pustaka yang kamu inginkan, lalu masuk kedalamnya (contoh april). Karena nimble akan mengunakan nama folder itu sebagai nama projek/pustaka yang akan kita buat.

  • Jalankan perintah nimble init maka akan muncul berbagai pertanyaan

    • Akan terdapat opsi library (pustaka), binary atau hybrid. Pilih binary (untuk membuat proyek) dengan memencet Tab di keyboard dan tekan enter untuk lanjut.
    • Nimble akan menanyakan versi (ini untuk memantau perkembangan proyek/pustaka kamu), sementara ini masukan 0.0.1.
    • Setelah ini nimble menanyakan deskripsi proyek, langsung tekan enter saja kalau belum ada.
    • Kemudian keterangan lisensi proyek/pustaka, bagian ini enter saja (kecuali kamu sudah paham lisensi yang mau dipakai)
    • Terakhir, versi nim terendah untuk proyek/pustaka yang dibuat, untuk ini enter saja.

Setelah membuat proyek dengan Nimble, sekarang didalam folder kita ada ada berkas dengan nama <nama proyek>.nimble yang berisi kurang lebih seperti ini:

# Package

version       = "0.0.1"
author        = "Y"
description   = "A new awesome nimble package"
license       = "MIT"
srcDir        = "src"
bin           = @["april"]


# Dependencies

requires "nim >= 1.6.2"

Berkas .nimble diatas adalah deskripsi dari proyek atau pusatka yang kita buat. Fungsi requires dalam .nimble berguna untuk mendefinisikan kalau proyek/pustaka kita perlu pustaka ini (contoh nim >= 1.6.2, perlu pustaka nim dengan versi sama atau lebih tinggi dari 1.6.2).

Kode dari pustaka yang didefiniskan lewat .nimble bisa digunakan didalam proyek/pustaka kita, karena tidak semua kode yang kita tulis murni dari kita sendiri, akan ada saatnya membutuhan pustaka orang lain untuk memenuhi kebutuhan kita tanpa harus kita yang menulisnya sendiri.

Pada bagian Pemrograman Modular akan membahas penggunaan kode dari file lain dan pustaka orang lain.

Mengenali struktur proyek

Contoh ini kita menggunakan proyek dari template binary, template ini diperuntuhkan membuat proyek kecil (karena kita tidak perlu testing sejauh ini). Setelah membuat projek selain .nimble kita juga punya folder bernama src.

Seperti ini bentuknya bila kita lihat dari file eksplorer:

+-[src]
|-- april.nim
+- april.nimble

Nama proyek yang saya gunakan : april, maka akan menghasilkan april.nimble dan src/april.nim yang menjadi entrypoint dari proyek. Entrypoint adalah bagian proyek yang akan dijalankan ketika nimble run, ditentukan didalam april.nimble pada bagian bin = @["april"] (definisi entrypoint).

Berikut isi dari src/april.nim:

# This is just an example to get you started. A typical binary package
# uses this file as the main entry point of the application.

when isMainModule:
  echo("Hello, World!")

Kode didalam baris when isMainModule akan menamplikan Hello World, ini yang akan terjadi jika kita menjalankan nimble run. Sekarang jalankan nimble run.

Pro-tip: Untuk membuat proyek yang membutuhkan testing, saat pembuatan proyek gunakan template hybrid ketimbang binary, karena sebagian kode kita akan berperan sebagai pelengkap entrypoint yakni menjadi pustaka yang perlu pengujian terpisah.

Pemrograman Modular

Pemrograman modular adalah cara bagaimana kita memecah kode kita yang sebelumnya dalam sebuah file besar menjadi kumpulan file-file kecil. Berikut contoh program transaksi saldo sederhana :

# april.nim

type 
  StatusTransaksi = enum 
    menungguPembayar | dibatalkan | berhasil

  Saldo = object
    id: string
    saldo: int

  Transaksi = object
    bcId: string # pengirim 
    ccId: string # penerima
    nominal: int # jumlah yang diterima
    status: StatusTransaksi
    deskripsi: string

var saldoNasabah : []Saldo = [
  Saldo(id: "Anya", saldo: 10000),
  Saldo(id: "Elisabet", saldo: 5000)
]

proc efekSaldo(transfer: Transaksi) =
  for nasabah in saldoNasabah:
    if nasabah.id == transfer.bcId:
      nasabah.saldo -= transfer.nominal
    elif nasabah.id == transfer.ccId:
      nasabah.id += transfer.nominal

proc cekSaldo(id: string) =
  for saldo in saldoNasabah:
    if saldo.id == id:
      echo "-- Akun ditemukan --"
      echo "Nama : " & saldo.id
      echo "Saldo : " & saldo.saldo

proc transaksiBaru(pbcid: string, pccId: string,pnominal:int ,pdeskripsi: string) : Transaksi =
  return Transaksi(
    bcid:pid,
    ccId:pccId,
    deskripsi:pdeskripsi,
    nominal: pnominal,
    status: StatusTransaksi.menungguPembayar)

# aksi untuk membatalkan transaksi
proc batalkanTransaksi(self:Transaksi) =
  if self.status != berhasil:
    self.status = StatusTransaksi.dibatalkan
    echo "Transaksi " & self.deskripsi & " dibatalkan "
  else:
    echo "Transaksi yang berhasil tidak bisa dibatalkan"

# aksi untuk membayar transaksi
proc bayar(self: Transaksi) =
  if self.status != dibatalkan:
    efekSaldo(self)
    self.status = StatusTransksi
    echo "Berhasil membayar untuk " & self.deskripsi
  else:
    echo "Transaksi yang dibatalkan tidak bisa berhasil"

when isMainModule:
  cekSaldo("Anya")
  cekSaldo("Elisabet")

  var transferTeman = transaksiBaru("Anya","Elisabet",5000,"Subrek OnlyFans Elisabet")
  transferTeman.berhasil()

  cekSaldo("Anya")
  cekSaldo("Elisabet")

Sekarang kita akan membagi kode diatas sesuai dengan kegunaanya masing-masing (transaksi.nim,saldo.nim dan april.nim):

# transaksi.nim

import ./saldo

type 
  StatusTransaksi = enum 
    menungguPembayar | dibatalkan | berhasil

  Transaksi = object
    bcId: string # pengirim 
    ccId: string # penerima
    nominal: int # jumlah yang diterima
    status: StatusTransaksi
    deskripsi: string


proc transaksiBaru(pbcid: string, pccId: string,pnominal:int ,pdeskripsi: string) : Transaksi =
  return Transaksi(
    bcid:pid,
    ccId:pccId,
    deskripsi:pdeskripsi,
    nominal: pnominal,
    status: StatusTransaksi.menungguPembayar)

# aksi untuk membatalkan transaksi
proc batalkanTransaksi(self:Transaksi) =
  if self.status != berhasil:
    self.status = StatusTransaksi.dibatalkan
    echo "Transaksi " & self.deskripsi & " dibatalkan "
  else:
    echo "Transaksi yang berhasil tidak bisa dibatalkan"

# aksi untuk membayar transaksi
proc bayar(self: Transaksi) =
  if self.status != dibatalkan:
    efekSaldo(self)
    self.status = StatusTransksi
    echo "Berhasil membayar untuk " & self.deskripsi
  else:
    echo "Transaksi yang dibatalkan tidak bisa berhasil"


# saldo.nim

type
  Saldo = object
    id: string
    saldo: int

var saldoNasabah : []Saldo = [
  Saldo(id: "Anya", saldo: 10000),
  Saldo(id: "Elisabet", saldo: 5000)
]

proc efekSaldo(transfer: Transaksi) =
  for nasabah in saldoNasabah:
    if nasabah.id == transfer.bcId:
      nasabah.saldo -= transfer.nominal
    elif nasabah.id == transfer.ccId:
      nasabah.id += transfer.nominal

proc cekSaldo(id: string) =
  for saldo in saldoNasabah:
    if saldo.id == id:
      echo "-- Akun ditemukan --"
      echo "Nama : " & saldo.id
      echo "Saldo : " & saldo.saldo

#april.nim

import ./transaksi
import ./saldo


when isMainModule:
  cekSaldo("Anya")
  cekSaldo("Elisabet")

  var transferTeman = transaksiBaru("Anya","Elisabet",5000,"Subrek OnlyFans Elisabet")
  transferTeman.berhasil()

  cekSaldo("Anya")
  cekSaldo("Elisabet")

Bentuk folder kita sekarang:

+-[src]
|-- april.nim
|-- saldo.nim
|-- transaksi.nim
+- april.nimble

Pada file transaksi.nim dan april.nim kita mempunyai kata kunci import, import (atau sebutanya mengimpor) berguna untuk memanggil sebuah file lokal atau pustaka untuk isinya diguankan di program kita.

File transaksi.nim kita mengimpor file ./saldo (saldo.nim untuk import .nim tidak perlu ditulis, ./ berarti lokasi script yang mengimpor) karena didalam file transaksi kita menggunakan fungsi efekSaldo dari saldo.nim begitu juga di dalam file april.nim mengimpor file transaksi.nim dan saldo.nim.

Bagian ini sudah keluar dari pemahasan Nim dasar dan masuk pembahasan fitur khusus yang dimiliki Nim, jadi bagian buku setelah pembahasan ini sudah memasuki bagian khusus Nim, bila pernasaran bila melangkah ke bab lain.

Web Programming dengan Nim

Bab ini akan membahas tentang pembuatan Web server menggunakan Nim, bagian ini akan menjelaskan bagaimana web , arsitektur client-server pada jaringan komputer, installasi framwork Jester ,membuat HTML dengan Nim dan penghubung ke database.

Referensi

Web

Web merupakan kumpulan halaman berisi teks, gambar dan video tersedia melalui protokol jaringan komputer. Halaman yang berisi teks, gambar dan video di bangun menggunakan Hyper Text Markup Language (HTML).

HTML merupakan bahasa markah yang bertugas untuk menyajikan konten hipertext (teks, gambar dan video dalam satu halaman) kumpulan markah hiperteks disebut sebagai dokumen HTML. HTML dibuka menggunakan browser untuk membentuk tampilan web, seperti halnya buku yang sedang kalian baca ini.

Jika kamu membaca buku ini melalui browser, coba klik kanan dan pilih View Page Source maka kamu akan melihat dokumen HTML dari halaman ini.

Protokol jaringan untuk web disebut dengan Hyper Text Transfer Protocol (HTTP), protokol ini berkerja dengan arsitektur client-server. Arsitektur ini membagi sebuah hubungan komputer menjadi 2 peran:

  • Server, komputer yang menyedia halaman HTML untuk diakses oleh Client.
  • Client, komputer meminta halaman HTML ke server untuk diterjemahkan pada Browser (seperti buku ini sekarang).

HTTP memiliki sebuah paket yang digunakan untuk mengirim (HTTP request) dan membalas permintaan (HTTP response) yang memiliki Header dan Body.

Header berisi rincian dari HTTP seperti kode status balasan (e.g 200,404,500), HTTP Request Method (e.g GET,POST, HTTP Request Method list) dan rincian header lainya (selengkapnya HTTP Header Standard) dan Body merupakan data yang client terima dari server atau client kirim ke server.

HTTP Request merupakan paket untuk meminta respon ke server dan HTTP Response membalas permintaan client oleh server, namun perbedaanya header paket HTTP Request memiliki HTTP Request Method dan HTTP Response memiliki kode status balasan.

Untuk melihat lalu lintas HTTP saat kalian membuka halaman ini, klik kanan > Inspect/Inspect Elemen > pilih tab Network kemudian refresh halaman (tekan F5) lalu pilih HTTP Request yang ingin inspeksi.

Simple Web : Hello World

Bagian ini akan mengenalkan proses penggunaan framework jester dari installasi hingga membalas request HTTP.

Installasi Jester

Jester adalah pustaka web framework yang ditulis dengan Nim, maka kita perlu menginstall pustaka jester:

$ nimble install jester

Warning: tanda $ hanya penegas bahwa ini perintah terminal dan jangan ikut ditulis.

Menampilkan Hello World

Jester telah terinstall, sekarang kita akan membuat sebuah URL / yang akan mengembalikan text Hello World. Buat file bernama web.nim dengan isi kode dibawah ini.

import jester

routes:
  get "/":
    resp "Hello World"

routes merupakan macro bawaan dari jester yang mendefinsikan request URL yang dibisa respon oleh web kita, kemudian get "/" adalah definisi URL yang akan di respon yaitu perintah HTTP GET ke URL /, terakhir resp adalah prosedur untuk mengirimkan data respon ke client yang mengirim HTTP request.

Kemudian jalankan dengan perintah berikut:

$ nim c -r web.nim

Setelah muncul pesan diterminal yang menunjukan alamat (e.g: localhost:3000), buka alamat tersebut di browser.

Infomasi lebih lanjut bisa mengunjungi Dokumentasi Jester.