Di tutorial Contoh STRING (variable) interpolation di bahasa Singkong, kita menggunakan interpolasi agar tidak harus menggabungkan sebuah literal STRING dan variabel, seperti contoh berikut (kode diketikkan pada Interactive evaluator Singkong).
> var a = 123456 > var b = number_group(a, ".", ",") > var c = words_id(string(a)) > println("Total adalah: " + b + " (" + c + ") Rupiah") Total adalah: 123.456 (Seratus dua puluh tiga ribu empat ratus lima puluh enam) Rupiah
Contoh tersebut dapat dituliskan ulang sebagai berikut, menjadi lebih ringkas dengan fungsi interpolate, yang akan menggantikan nama variabel yang dituliskan diantara { dan } dengan nilainya:
> println(interpolate("Total adalah: {b} ({c}) Rupiah")) Total adalah: 123.456 (Seratus dua puluh tiga ribu empat ratus lima puluh enam) Rupiah
Fungsi interpolate cukup fleksibel pada variabel yang tidak ditemukan, dan akan menampilkan nama variabel tersebut apa adanya, tanpa ada nilai yang diganti. Walau demikian, fungsi interpolate memiliki beberapa keterbatasan berikut:
Sejak Singkong versi 10.8, fungsi template telah disediakan. Pada dasarnya, fungsi template akan mengevaluasi kode yang dituliskan diantara $ dan $. Dengan demikian, semua keterbatasan fungsi interpolate yang disebutkan sebelumnya, dapat diselesaikan dengan fungsi template. Sama seperti interpolate, evaluasi kode dilakukan secara case-insensitive. Sebagai catatan, apabila variabel tidak ditemukan pada saat evaluasi, maka akan digantikan dengan pesan kesalahan untuk variabel tersebut. Contoh:
> var a = "Singkong" > var b = [1,2,3,4] > var s = "Hello, $a$ $b$ $c$" > a "Singkong" > b [1, 2, 3, 4] > s "Hello, $a$ $b$ $c$" > template(s) "Hello, Singkong [1, 2, 3, 4] ERROR: [line: 1] identifier not found: c" > upper(s) "HELLO, $A$ $B$ $C$" > template(upper(s)) "HELLO, Singkong [1, 2, 3, 4] ERROR: [line: 1] identifier not found: C"
Tentu saja, begitu variabelnya ditemukan, kita dapat kembali memanggil fungsi template tersebut.
> var c = {1:2, 3:4} > template(s) "Hello, Singkong [1, 2, 3, 4] {1: 2, 3: 4}"
Kita dapat menggunakan fungsi template untuk evaluasi ekspresi apapun yang valid, seperti contoh berikut:
> template("$1 + 2 + 3$") "6"
Kita bahkan dapat membuat variabel yang dapat digunakan di luar environment fungsi template tersebut. Pada contoh berikut, variabel d dibuat ketika memanggil fungsi template:
> d ERROR: [line: 1] identifier not found: d > template("$d$") "ERROR: [line: 1] identifier not found: d" > template("$var d = 1 + 2 + 3$") "" > d 6 > template("$d$") "6"
Yang mungkin terasa berguna adalah ketika kita bisa langsung memanggil fungsi, seperti contoh berikut. Tidak perlu menyimpan hasil kembalian pemanggilan fungsi ke variabel.
> template("$words_en(string(1+2+3))$") "Six" > template("$words_en(string(d))$") "Six"
Bekerja dengan ARRAY atau HASH? Tentu tidak masalah. Kita bisa membuat langsung variabelnya, bekerja dengan indeks, dan memanggil fungsi seperti contoh berikut:
> template("$var e = [1,2,3,4,5]$ Array: $e$, Length: $len(e)$, Sum: $sum(e)$, Array[4] = $e[4]$") " Array: [1, 2, 3, 4, 5], Length: 5, Sum: 15, Array[4] = 5"
Seru bukan? Atau Anda menjadi khawatir karena fungsi-fungsi (yang tidak didisable) dapat dipanggil dari fungsi template? Dengan demikian, kita tidak dapat percaya begitu saja kode template yang ditulis oleh developer lain (karena, bisa saja memanggil fungsi terkait sistem). Apabila Anda menjadi khawatir, kita bisa tambahkan fungsi-fungsi yang tidak diijinkan ke dalam daftar fungsi yang didisable (ketika menjalankan Singkong). Pada contoh berikut, kita disable fungsi sum dan kita enable lagi. Perhatikanlah perbedaan hasilnya (dan cara penggunaan fungsi disabled):
> disabled() [] > disabled([sum]) ["sum"] > disabled() ["sum"] > template("$var e = [1,2,3,4,5]$ Array: $e$, Length: $len(e)$, Sum: $sum(e)$, Array[4] = $e[4]$") " Array: [1, 2, 3, 4, 5], Length: 5, Sum: ERROR: [line: 1] built-in function "sum" is disabled, Array[4] = 5" > disabled([]) [] > template("$var e = [1,2,3,4,5]$ Array: $e$, Length: $len(e)$, Sum: $sum(e)$, Array[4] = $e[4]$") " Array: [1, 2, 3, 4, 5], Length: 5, Sum: 15, Array[4] = 5"Fungsi template juga dapat mengevaluasi seleksi kondisi if dan perulangan, seperti contoh berikut:
> var f = [1,2,3,4,5] > template("Empty: $if (empty(f)) { true } else { false }$") "Empty: false" > var f = [] > template("Empty: $if (empty(f)) { true } else { false }$") "Empty: true" > template("$var g = []$ Init: $g$ $each(range(0, 16, 4), fn(e, i) { g + e })$ Result: $g$") " Init: [] Result: [0, 4, 8, 12]"
Yang barangkali menjadi catatan adalah: apabila terdapat nilai null, maka akan digantikan dengan STRING kosong.
Terima kasih telah membaca :)