7 Evaluasi Ekspresi dan Persamaan
7.3 Variabel Bebas
Pada sisi right-hand dari suatu penyamaan/equation (seperti halnya di bagian kondisi dan sisi righthand dari definisi lokal), kita membedakan antara variabel terikat, yaitu, simbol variabel tak memenuhi syarat (unqualified) yang diperkenalkan di sisi left-hand dari suatu penyamaan/equation (atau sisi left-hand dari suatu definisi lokal, lihat Bagian 7.4 [Variabel Lokal], halaman 58), dan variable bebas atau variabel global yang tidak terikat] oleh pola sisi left-hand manapun. Variabel bebas dapat juga dideklarasikan dengan tegas menggunakan suatu deklarasi var (cf. Bab 5 [Deklarasi], halaman 29). Mereka secara efektif diperlakukan sebagai symbol fungsi (tanpa parameter), kalau tidak mereka mungkin ditugaskan sebagai suatu nilai atas pertolongan suatu definisi variabel. Definisi variabel mempunyai sintaks berikut :
definition : ’def’ expression ’=’ expression {’,’ expression ’=’ expression} ’;’ | ’undef’ identifier {’,’ identifier} ’;’ Sebagai contoh, di (dalam) penyamaan berikut ,
foo X = C*X;
variabel C menjadi bebas pada sisi right-hand dan kita mempunyai: ==> foo 23
C*23
Kita dapat menugaskan suatu nilai kepada variabel sebagai berikut (ini bisa dilakukan di dalam script atau secara interaktip di dalam interpreter):
def C = 2;
Setelah definisi ini kita mempunyai:
==> foo 23 46
Tidak ada yang berharga di sini bahwa, untuk kenyamanan, lingkungan variabel global menggunakan ikatan dinamis (dynamic binding), yaitu, kamu dapat merubah nilai dari suatu variabel bebas pada setiap waktu secara interaktip di dalam interpreter:
==> def C = 3; foo 23 69
Ini juga membuatnya mungkin untuk mempunyai definisi berulang seperti berikut:
==> def fac = \N.if N>0 then N*fac (N-1) else 1 ==> fac
\X1 . if X1>0 then X1*fac (X1-1) else 1 ==> map fac [1..10]
[1,2,6,24,120,720,5040,40320,362880,3628800]
Dalam kontras, variabel yang terikat (yang terikat oleh sisi left-hand dari penyamaan/equation, cf. Bagian 7.1 [Penyamaan (Equations)], halaman 51, atau di dalam suatu definisi variabel lokal, cf. Bagian 7.4 [Variabel Lokal], halaman 58) selalu menggunakan ikatan lexical, yaitu, nilai-nilai mereka selalu dengan sepenuhnya ditentukan oleh konteks (statis) konteks dari penyamaan/equation untuk yang mana mereka menjadi anggota. Ini adalah penting sebab menjamin ketransparanan yang mempunyai garansi/petunjuk, yaitu, nilai-nilai dari sisi left-hand
dan variabel lokal di dalam suatu penyamaan/equation hanya akan tergantung pada ungkapan/expression untuk yang mana penyamaan/equation diterapkan, sepanjang definisi tidak melibatkan operasi manapun dengan efek samping, seperti I/O. Nilai-Nilai dari variabel bebas boleh berubah, tetapi hanya diantara evaluasi ungkapan/expression yang berbeda, seperti tidak ada fungsi yang akan mengijinkan kamu untuk merubah nilai dari suatu variabel global selama suatu evaluasi berkelanjutan. Ini berlawanan dengan bahasa perograman fungsional lain seperti Lisp yang mengijinkan kamu untuk memodifikasi nilai yang ditugaskan ke suatu variabel di dalam suatu definisi fungsi.
Variable bebas bermanfaat jika kamu mempunyai suatu script yang berulang-kali mengacu pada nilai yang sama yang kalkulasinya mungkin mahal atau melibatkan fungsi dengan efek samping. Dengan menugaskan nilai seperti itu kepada suatu variabel, kamu dapat mengacu padanya tanpa keharusan untuk menghitung kembali nilai setiap kali [itu] diperlukan, sebagaimana kasus dengan suatu definisi fungsi yang bersesuaian (a corresponding function definition).
Sisi right-hand dari suatu definisi variabel mungkin adalah suatu ungkapan/expression Q, seperti diuraikan di Bab 6 [Ungkapan (Expressions)], halaman 35. Ungkapan/Expressions dievaluasi sekali, ketika script dijalankan, dan kemudian diadukan dengan sisi left-hand dari definisi, mengikat variabel kepada nilai komponen yang bersesuaian dari nilai sisi right-hand. Di dalam kasus khusus bahwa sisi left-hand adalah variabel tunggal, itu adalah ikatan yang sederhana untuk nilai sisi right-hand. Kapan saja suatu variabel yang digambarkan menjadi
“bebas” pada sisi right-hand dari suatu penyamaan/equation atau definisi variabel, [itu] akan digantikan oleh nilai dari ungkapan yang ditugaskan (assigned expression). Sebagai contoh, definisi berikut menugaskan nilai exp 1.0 = 2.71828... kepada variabel bebas e:
var e = exp 1.0;
(Catat bahwa kita harus menggunakan suatu deklarasi variabel tegas/eksplisit di sini, karena ‘e’
adalah suatu tulisan huruf kecil dan karenanya jika tidak akan diambil untuk menandakan suatu simbol fungsi. Kita juga menggunakan suatu definisi variabel dengan initializer yang mendeklarasikan dan menggambarkan variabel dalam langkah tunggal. Lihatlah Bab 5 [Deklarasi], halaman 29.)
Definisi variabel dilaksanakan di dalam order/pesanan di mana mereka terjadi di dalam suatu script, sedemikian sehingga suatu definisi boleh mengacu pada nilai-nilai variabel yang ditugaskan di dalam definisi sebelumnya. Ini juga mungkin untuk mengesampingkan tugas buatan definisi sebelumnya, dan untuk tidak menggambarkan suatu variabel. Berbagai definisi dapat dilakukan dengan statemen def tunggal. Sebagai contoh:
def N = 99, K = N, N = 2*K+1, M = N; undef N, K;
Seperti yang telah disebutkan, nilai yang ditugaskan ke suatu variabel boleh juga diubah dengan statemen def dan undef di dalam interpreter, lihat Bagian B.2 [Bahasa Perintah (Command Language)], halaman 205.
Catat bahwa suatu variabel dapat juga dideklarasikan const, yang dapat digunakan untuk memperkenalkan nilai-nilai tetap/constant, seperti di:
Dalam hal ini variabel hanya dapat ditugaskan sekali, setelah itu mencoba untuk menugaskan suatu nilai baru kepada variabel yang sama akan menghasilkan suatu pesan kesalahan:
==> def c = 300000000
! Tidak bisa menggambarkan kembali (redefine) variabel const
>>> def c = 300000000
Definisi variabel bebas dapat juga melibatkan suatu pola pada sisi left-hand yang mana adalah untuk diadukan dengan nilai yang disediakan. E.G.,
def (X,Y) = foo Z;
menyebabkan foo Z dievaluasi dan diadukan dengan (X,Y). Interpreter kemudian menggambarkan variabel bebas X dan Y accordingly. pola mempertemukan dilakukan di dalam cara yang sama perihal untuk sisi left-hand dari suatu penyamaan/equation. Bagaimanapun, suatu kesalahan dilaporkan jika mempertemukan gagal.
Sejumlah variabel bebas built-in telah digambarkan oleh interpreter ketika mulai start, dan di
sana juga suatu variabel bebas tanpa nama ‘_’ yang digunakan untuk merekam hasil dari
evaluasi ungkapan/expression paling terbaru dilakukan di dalam pengulangan evaluasi interaktip interpreter. Lihatlah Bagian B.2 [Bahasa Perintah (Command Language)], halaman 205, untuk detil.