• Tidak ada hasil yang ditemukan

Constants and Variables

Dalam dokumen Buku bhs pemrograman Q Equational 2018 (Halaman 44-46)

4 Skript dan Modul

6.1 Constants and Variables

Identifier Nonterminals, number dan string yang terjadi di dalam aturan sintaks di atas mengacu pada kesatuan lexical yang berhubungan dengan kamus diperkenalkan di Bab 3 [Lexical Matters], halaman 21. Catatlah bahwa bahasa Q benar-benar mencirikan dua tipe yang berbeda dari identifiers (function dan variable identifiers) dan dua tipe berbeda dari numeric quantities (bilangan bulat/integers dan floating point numbers). Bilangan bulat/integer diterapkan sebagai

“bignums” menggunakan paket multiprecision GNU (GMP); dengan begitu ukuran dari suatu

nilai integer/bilangan bulat hanya dibatasi oleh memori yang tersedia. Nilai-Nilai floating point diterapkan menggunakan 64 bit (yaitu, ketepatan ganda/double precision) floating point numbers; pada kebanyakan mesin, hal ini perlu menyediakan nilai mutlak nonzero berkisar antara 1.7E-308 sampai 1.7E308 dan suatu ketepatan dari 15 digit desimal.

String constants adalah urutan karakter yang secara internal diwakili sebagai array karakter yang mengijinkan constant-time mengakses kepada karakter individu dari suatu string. Tidak ada suatu pembatasan panjang yang mendasar untuk string constants. Di dalam implementasi yang sekarang, karakter null \0 dipesan sebagai suatu terminator string dan tidak harus digunakan sebagai suatu karakter string biasa.

Lagipula, bahasa Q menyediakan lima built-in constants lain yang menandakan nilai-nilai kebenaran (true dan false), dan list yang kosong, stream dan tuple([],{} dan (), untuk dibahas di Bagian 6.3 [Lists Streams dan Tuples], halaman 38).

Suatu simbol variabel dapat “terikat” atau “bebas”, tergantung pada konteks di mana itu terjadi.

Kita katakan bahwa suatu variabel terikat di dalam suatu penyamaan/equation jika itu terjadi pada sisi left-hand dari equation/penyamaan. Cara lainnya, variabel adalah suatu variabel bebas. Dalam hal ini, variabel boleh menandakan suatu nilai (yang diperkenalkan dengan def), atau secara sederhana mewakili dirinya sendiri. Dalam beberapa kasus, suatu variabel adalah suatu ungkapan/expression atomis yang legal/sah boleh berdiri di mana saja suatu constants diijinkan. Pada sisi left-hand dari equation/penyamaan, adalah mungkin untuk mendeklarasikan bahwa suatu variabel adalah suatu tipe yang ditentukan dengan menggunakan notasi: variable:type. Hal ini memerlukan bahwa kamu sebelumnya sudah mendeklarasikan type sebagai identifier type, lihat Bab 5 [Deklarasi], halaman 29. Ketika suatu identifier type ditetapkan dengan suatu variabel, variabel akan hanya me-match-ingkan nilai-nilai kepunyaan type yang diberikan, cf. Bagian 7.5 [Type Guards], halaman 60.

Pada sisi tangan kanan (right-hand side) dari equation/penyamaan, suatu identifier yang tak memenuhi syarat (unqualified identifier) dapat juga diawali dengan kata kunci var untuk menunjukkan bahwa identifier akan diperlakukan sebagai suatu simbol variabel bebas. Deklarasi variabel inline seperti itu dapat digunakan untuk variabel bebas escape (jika identifier yang sama juga diperkenalkan sebagai suatu variabel terikat pada sisi left-hand dari

equation/penyamaan) dan untuk mendeklarasikan simbol variabel bebas [yang] masih diudara, lihat Bagian 7.4 [Variabel Lokal], halaman 58, untuk detil.

6.2 Aplikasi

Aplikasi mungkin adalah construct tunggal yang paling utama di dalam bahasa Q. Hal ini

mengijinkan kamu untuk menerapkan satu object (“fungsi”) ke object yang lain (“argument”). Construct ini digunakan untuk menandakan “pemanggilan fungsi” seperti sqrt 2 seperti halnya “terminologi pembangun (constructor terms)” seperti bin X T1 T2 yang mengkodekan/encode

struktur data seperti pohon. Juga, ketika kita akan melihat Bagian 6.4 [Operator Built-In], halaman 40, operator built-in +,-, dll. Adalah selalu “syntactic sugar” untuk aplikasi.

Seperti di bahasa fungsional yang lain jaman ini, aplikasi adalah suatu operasi biner yang ditulis secara sederhana sebagai juxtaposition/penjajaran: X Y menandakan aplikasi X ke Y, keduanya mungkin adalah expression/ungkapan arbitary miliknya sendiri. Aplikasi menghubungkan ke sisi kiri; construct X Y1... Yn setara dengan (...(( X Y1) Y2)...) Yn, dan menandakan aplikasi X ke n argument Y1,..., Yn. Gaya penulisan aplikasi fungsi ini biasanya dikenal sebagai currying, setelah ahli logika Amerika H.B. Curry. Kita akan katakan lebih banyak tentang ini segera. Di sini adalah beberapa contoh aplikasi yang valid/sah:

sqrt 2 sqrt (Y+1)

foo X (bar (Y-1)) Z

Catat bahwa aplikasi ini adalah left-associative, aplikasi yang tersarang (nested) di dalam argument harus dipasang dengan tanda kurung. Sebagai contoh, foo (bar X) menerapkan foo untuk bar X, sedangkan foo bar X menerapkan foo untuk dua argument bar dan X.

Karena currying ada dimana mana di dalam programming fungsional, kamu harus terbiasa dengan itu, maka mari kita dengan singkat menjelaskan apa artinya, dan apa kegunaannya. Fungsi berbagai argument multiple bisa secara umum digambarkan dalam dua jalan yang berbeda:

• Sebagai suatu fungsi yang mengambil argument tunggal, structured argument (umumnya suatu

tuple). Ini adalah yang tradisional, metoda “uncurried” salah satu yang biasanya

menghadapi/encounters di dalam matematika. Sebagai contoh, kita mungkin menggambarkan fungsi max, yang menghitung maksimum dari dua nilai, sebagai berikut:

max (X,Y) = X if X>Y; = Y otherwise;

• Secara berulang, sebagai fungsi yang, ketika diberi argument yang pertama, menghasilkan fungsi argument sisanya yang lain. Fungsi seperti itu disebut curried. Sebagai contoh, di sini adalah suatu definisi curried untuk fungsi max:

max X Y = X if X>Y; = Y otherwise;

Di sini X Y max dibaca sebagai (X max) Y, mengartikan bahwa dengan menerapkan max untuk argument yang pertama X, kita memperoleh fungsi X max yang lain, yang mana, ketika

diterapkan/diberlakukan untuk argument yang kedua Y, menghasilkan nilai maksimum dari X dan Y. (Kebetulan, format curried ini juga cara dimana fungsi max benar-benar digambarkan di dalam standard library.)

Bahasa Q mendukung kedua macam notasi. Memilih diantara keduanya adalah lebih dari sekedar sesuatu rasa. Di samping menyimpan tanda kurung, fungsi curried menyediakan suatu

cara murah untuk memperoleh fungsi baru melalui “aplikasi parsial (partial applications)” dari

suatu fungsi multi-argument.

Sebagai contoh, memberikan definisi curried dari max di atas, max 0 dapat digunakan untuk

menandakan fungsi menghitung “bagian nonnegative” dari argumentnya (yang mana argumentnya sendiri jika nonnegative, dan nol cara lainnya). Ini tidak bekerja dengan definisi uncurried karena definisi itu memerlukan kita untuk menetapkan kedua argument max di dalam satu chunk; sebagai gantinya, kita akan mulai melukiskan fungsi yang dijabarkan (the derived function) dari awal.

Definisi uncurried juga mempunyai jasa. Khususnya, mereka mengijinkan kita untuk menggambarkan fungsi variadic, yaitu, fungsi yang mampu menangani sejumlah argument yang bermacam-macam. Sebagai contoh, definisi berikut memungkinkan kita untuk menerapkan fungsi max bagi kedua pasangan (pairs) dan rangkap tiga (triples):

max (X,Y) = X if X>=Y; = Y otherwise; max (X,Y,Z) = max (X,max (Y,Z))

Sesungguhnya, dalam bahasa Q adalah mungkin untuk menggambarkan fungsi umum yang meminta kepada sejumlah argument ditetapkan sebagai tuple. Sebagai contoh, versi max berikut menangani tuples dari sejumlah ukuran sedikitnya 2:

max (X,Y) = X if X>=Y; = Y otherwise;

max (X,Y|Zs)= max (X,max (Y|Zs));

Dalam contoh di atas, notasi (...| Zs) digunakan untuk menandakan suatu tuple dengan

“ekor/tail” Zs. Ini diterangkan di bagian berikut.)

Dalam dokumen Buku bhs pemrograman Q Equational 2018 (Halaman 44-46)