Kumpulan nilai pada Nim ditampung oleh tiga wadah inti. string menampung teks, seq menampung deret yang panjangnya berubah selama program berjalan, dan array menampung deret dengan panjang tetap yang ditentukan saat kompilasi. Topik ini membahas deklarasi dan operasi dasar ketiganya beserta slice (potongan) yang berlaku seragam, dengan contoh penghitung kata, statistik nilai ujian, dan daftar belanja.
String dan modul strutils#
String menyimpan rangkaian karakter dan ditulis di dalam tanda kutip ganda. Proc len menghitung jumlah karakternya, indeks dalam tanda kurung mengambil satu karakter, sedangkan operator & merangkai dua string menjadi satu. Perbandingan kesamaan memakai operator == sebagaimana angka, dan for dapat berjalan di atas string untuk membaca karakternya satu per satu.
Indeks string menghasilkan satu karakter bertipe char, sehingga bahasa[0] pada string pemrograman menghasilkan huruf p. Operator & boleh dirangkai lebih dari dua kali, misalnya "Nim" & " " & "2.4" menghasilkan Nim 2.4, dan perbandingan "abc" == "abc" menghasilkan true. Perulangan for di atas string menghasilkan karakter satu per satu tanpa indeks manual, sehingga pemrosesan per huruf cukup ditulis sebagai satu blok for.
Operasi yang lebih kaya disediakan modul strutils dari pustaka standar. Modul ini menyediakan split untuk memecah string menjadi seq, join untuk merangkai seq menjadi string, toUpperAscii untuk mengubah huruf menjadi besar, serta replace dan strip untuk membersihkan teks. Modulnya diimpor dengan pernyataan import strutils di awal berkas.
Program berikut menghitung kata pada satu kalimat. Kalimat dipecah berdasarkan spasi, setiap kata dilaporkan beserta panjangnya, lalu keseluruhannya ditampilkan sebagai huruf besar dan dirangkai ulang dengan tanda hubung.
import strutils
const kalimat = "nim adalah bahasa pemrograman yang dikompilasi ke c"
let kata = kalimat.split(" ")
echo "jumlah kata: ", kata.len
for k in kata:
echo "- ", k, " (", k.len, " huruf)"
echo "huruf besar: ", kalimat.toUpperAscii()
echo "gabung: ", kata.join("-")# kompilasi dan jalankan program, hint kompilasi disembunyikan
nim c --hints:off -r penghitung_kata.nimjumlah kata: 8
- nim (3 huruf)
- adalah (6 huruf)
- bahasa (6 huruf)
- pemrograman (11 huruf)
- yang (4 huruf)
- dikompilasi (11 huruf)
- ke (2 huruf)
- c (1 huruf)
huruf besar: NIM ADALAH BAHASA PEMROGRAMAN YANG DIKOMPILASI KE C
gabung: nim-adalah-bahasa-pemrograman-yang-dikompilasi-ke-csplit menghasilkan seq[string] berisi delapan kata. Proc len pada setiap kata menampilkan panjang masing-masing, sedangkan toUpperAscii dan join bekerja pada keseluruhan teks. Kata sepanjang satu huruf seperti c tetap terhitung sebagai satu kata karena pemisahnya adalah spasi.
seq: deret yang panjangnya berubah#
seq menyimpan deret nilai dengan panjang yang dapat bertambah dan berkurang saat program berjalan. Tipe lengkapnya ditulis seq[string] atau seq[int], dan nilai awalnya dibuat dengan awalan @ di depan tanda kurung, misalnya @["beras", "telur"]. Proc add menambah elemen di ujung deret, sedangkan len menghitung banyak elemennya. Elemen diakses melalui indeks yang dimulai dari 0.
Awalan @ wajib ditulis karena tanda kurung tanpa @ menandakan array, sehingga @["beras"] dan ["beras"] merupakan dua wadah yang berbeda tipe. Sekali dibuat dengan @, wadahnya menjadi seq yang panjangnya bebas diubah.
Program berikut membangun daftar belanja dari tiga item awal menjadi lima item.
# Daftar belanja pribadi dengan seq
var belanja: seq[string] = @["beras", "telur", "minyak"]
belanja.add("gula")
belanja.add("kopi")
echo "jumlah item: ", belanja.len
echo belanja
echo "dua item terakhir: ", belanja[^2 .. ^1]
echo "item pertama: ", belanja[0]jumlah item: 5
@["beras", "telur", "minyak", "gula", "kopi"]
dua item terakhir: @["gula", "kopi"]
item pertama: berasecho menampilkan seq dengan awalan @, sehingga keluarannya berupa @["beras", "telur", "minyak", "gula", "kopi"]. Indeks belanja[0] mengambil item pertama, sedangkan indeks berbasis ^ menghitung dari ujung belakang dan dipakai potongan dua item terakhir pada keluaran.
array: deret berukuran tetap#
array menyimpan deret dengan panjang tetap yang ditentukan saat deklarasi. Tipe lengkapnya menyebut panjang dan tipe elemen, misalnya array[5, float] untuk lima bilangan pecahan. Karena panjangnya tetap, array tidak memiliki proc add, dan compiler mengetahui ukurannya sejak waktu kompilasi. Array merupakan value type, sehingga penugasan ke variabel lain menyalin seluruh isinya.
Panjang yang tetap membuat array cocok untuk data yang jumlahnya sudah diketahui sejak awal, seperti lima nilai ujian pada contoh. Panjangnya menjadi bagian dari tipe, sehingga array[5, float] dan array[6, float] merupakan dua tipe yang berbeda. Koleksi yang jumlahnya berubah di tengah program lebih tepat ditampung seq.
Program berikut menghitung statistik lima nilai ujian. Deret nilainya dinyatakan sebagai const karena isinya tetap, lalu dijumlahkan melalui for.
# Statistik lima nilai ujian
const nilai: array[5, float] = [80.0, 75.0, 90.0, 85.0, 70.0]
var jumlah = 0.0
for n in nilai:
jumlah = jumlah + n
echo "semua nilai: ", nilai
echo "jumlah: ", jumlah
echo "rata-rata: ", jumlah / nilai.len.toFloat
echo "nilai terakhir: ", nilai[^1]semua nilai: [80.0, 75.0, 90.0, 85.0, 70.0]
jumlah: 400.0
rata-rata: 80.0
nilai terakhir: 70.0for berjalan di atas array tanpa iterator tambahan, sehingga setiap elemen terbaca satu per satu. echo menampilkan array dengan tanda kurung siku tanpa awalan @, berbeda dari seq. Indeks ^1 mengambil elemen terakhir tanpa harus mengetahui panjang array tersebut.
Slice pada ketiga wadah#
Slice mengambil sebagian isi wadah sebagai wadah baru. Bentuknya berupa indeks awal dan akhir yang dipisah operator .., dengan a .. b menyertakan kedua ujung, sedangkan a ..< b tidak menyertakan batas atasnya. Indeks berbasis ^ menghitung dari akhir, sehingga ^1 adalah elemen terakhir dan ^2 elemen sebelumnya. Ketiga wadah memakai notasi yang sama.
const bahasa = "pemrograman"
echo bahasa[0 .. 2]
echo bahasa[^3 .. ^1]
echo bahasa[2 ..< 7]pem
man
mrogrPotongan pertama mengambil tiga huruf pertama, potongan kedua mengambil tiga huruf terakhir melalui indeks ^, dan potongan ketiga memakai batas atas terbuka. Slice juga berlaku pada seq dan array, sebagaimana potongan dua item terakhir pada daftar belanja di bagian sebelumnya. Hasil slice pada seq maupun array berupa seq baru, sedangkan slice pada string berupa string.
Batas ..< setara dengan mengurangi satu dari batas atas .., sehingga bahasa[2 ..< 7] mengambil huruf pada posisi 2 sampai 6 dan menghasilkan mrogr. Indeks ^1 menunjuk huruf terakhir dan ^2 huruf sebelumnya, sehingga bahasa[^3 .. ^1] menghasilkan man. Notasi yang sama diterapkan pada seq dan array tanpa perubahan, sehingga belanja[^2 .. ^1] pada daftar belanja menghasilkan dua item terakhir.
Ringkasan#
stringmenyimpan teks dengan operasi dasarlen, indeks, dan&, sementarastrutilsmenyediakansplit,join, dantoUpperAscii.seqberpanjang dinamis, dibuat dengan awalan@, dan dikembangkan melalui procadd.arrayberpanjang tetap yang ditentukan saat kompilasi, dan penugasannya menyalin seluruh isi.- Slice memakai
..dengan kedua ujung termasuk,..<dengan batas atas terbuka, dan^untuk menghitung dari akhir, serta menghasilkan seq untuk seq maupun array.
Referensi#
- strutils — Nim Project — Dokumentasi proc split, join, toUpperAscii, replace, dan strip pada pustaka standar.
- Nim Tutorial (Part I) — Nim Project
— Menjelaskan string, array, seq, semantik salin array, dan slice dengan indeks
^. - Modul system — Nim Project
— Mendefinisikan template
..<untuk rentang dengan batas atas terbuka.