Tutorial Common Lisp Menggunakan GNU CLISP
Agro Rachmatullah (agro1986 [di] gmail.com)
11 Mei 2004
Pendahuluan
Lisp adalah bahasa pemrograman yang sudah berumur lebih dari 40 tahun. Keunggulan Lisp terletak pada kemampuannya memanipulasi simbol dan hubungan antar simbol dengan mudah, sehingga bahasa ini cocok digunakan di bidang Artificial Intelligence (kecerdasan buatan) dan pengambilan keputusan. Walaupun begitu, bahasa ini juga dapat digunakan untuk memecahkan masalah-masalah lainnya.
Selama perkembangannya, Lisp menghasilkan banyak varian dan merupakan cikal bakal berbagai bahasa lainnya (misalnya Logo dan Smalltalk). Pada 8 Desember 1994 ANSI (American National Standard Institute) berhasil menstandarisasi Lisp, yang diberi nama Common Lisp ANSI. Tutorial ini akan mengajarkan Common Lisp ANSI dengan menggunakan compiler/interpreter GNU CLISP. Untuk selanjutnya, jika tutorial ini menyebutkan "Lisp" maka yang dimaksud adalah "Common Lisp ANSI".
Lisp menarik untuk dipelajari sebab Lisp jauh berbeda dibandingkan dengan bahasa pemrograman seperti Pascal dan C. Setelah banyak menggunakan Lisp, kita akan bisa melihat/menganalisa suatu masalah dari sudut pandang yang sebelumnya tidak pernah kita bayangkan. Paling tidak, Lisp dapat digunakan sebagai kalkulator yang handal (akan ditunjukkan pada tutorial ini).
Menginstall dan Menjalankan GNU CLISP
Tutorial ini akan memandu proses instalasi GNU CLISP 2.33 untuk Windows (yang kadang-kadang akan kita singkat CLISP).
1. Download GNU CLISP 2.33 dari http://webstudent.ugm.ac.id/~agro_r/files/clisp-2.33-win32.zip (Hanya 3.4 MB!).
2. Extract isinya ke folder tempat anda ingin menginstallnya. Semua isi file zip akan diextract ke sub-folder "clisp-2.33". Misalnya jika anda mengextractnya ke "C:\Program Files", semua file-filenya akan diletakkan ke "c:\Program Files\clisp-2.33".
3. Masuk ke folder "clisp-2.32". Jalankan file "install.bat". Pilih 'Y' untuk setiap pertanyaan yang diajukan.
4. Sayangnya, setup yang disediakan lupa melakukan satu hal, jadi anda harus melakukan satu langkah tambahan. Anda harus mengcopy file "lisp.exe" yang terletak di folder "clisp-2.33\base" ke folder "clisp-2.33".
Sekarang CLISP dapat dijalankan lewat iconnya di desktop. Anda akan mendapatkan tampilan seperti berikut:
Kita akan memasuki sebuah prompt dimana kita bisa mulai menuliskan program kita. CLISP merupakan lingkungan pemrograman yang bersifat read-eval-print. Artinya, begitu kita selesai memasukkan/mengetik form dalam CLISP, maka CLISP akan segera menjalankannya dan menuliskan hasilnya (dalam pembuatan program C atau Pascal, biasanya kita menggunakan siklus write-compile-run).
Catatan: Anda bisa mendapatkan versi terbaru GNU CLISP di http://clisp.cons.org.
List dan Atom
Pada bagian ini kita akan mempelajari elemen-elemen dasar Lisp yaitu list dan atom. Contoh-contoh yang diberikan di bagian ini sebagian besar hanya untuk ilustrasi dan tidak dapat diketikkan ke dalam CLISP (akan menghasilkan error). Kita akan mulai menulis program pada bagian berikutnya, "Form".
Hal pertama yang harus kita tahu adalah bahwa segala sesuatu yang dimulai dan diakhiri tanda kurung adalah sebuah list. Sebagai contoh, hal-hal berikut adalah list:
(1 2 3 4 5)
(w x y z)
(rumah tanah kucing 123)
Sebuah list bisa saja kosong maupun berisi list lain. Jadi yang berikut adalah merupakan list juga:
()
((1 10 100))
((x y) 3 4 (hitam merah))
(defun kurangi-satu (x) (- x 1))
List bisa berisi program ataupun data, dan karena kita bisa memasukkan list di dalam list, kita bisa mencampur data dan program pada berbagai tingkatan. Inilah salah satu kekuatan LISP bagi yang sudah menguasainya, namun merupakan sumber kebingungan bagi yang belum menguasainya. Bersiap-siaplah juga untuk menghadapi banyak kurung buka dan kurung tutup.
Elemen-elemen yang berada di dalam list disebut atom. Jadi dalam list
(1 2 3 tangan kanan)
yang disebutkan di bawah merupakan atom:
1
2
3
tangan
kanan
Syarat utama dari atom adalah diawali dan diakhiri spasi (termasuk tab dan newline) atau kurung buka atau kurung tutup. Atom dapat terdiri dari karakter-karakter yang bukan pembatas atom. Perlu diketahui bahwa atom dapat berada di luar list. Inilah beberapa contoh atom lain:
:monitor
!**!
-
@hotmail.com
2*3+1
Lisp tidak case-sensitive, jadi ketiga atom di bawah adalah sama:
saya
SayA
SAYA
Lisp juga tidak mengenal operator, jadi 2*3+1 bukanlah suatu expresi matematika yang nilainya 7. Kalaupun digunakan spasi, maka 2 * 3 + 1 akan menjadi lima buah atom yang juga tidak bernilai 7.
Perhatikan bahwa spasi yang banyak sama saja dengan sebuah spasi, jadi kedua list di bawah ini sama (memang terlihat rumit, tapi untuk sekarang tidak perlu dimengerti artinya):
(defun faktorial (x) (if (eql x 0) 1 (* x (faktorial (- x 1)))))
(defun faktorial(x)(if(eql x 0)1(* x(faktorial(- x 1)))))
Tentunya penulisan yang pertama lebih mudah dibaca. Akan lebih baik lagi jika dituliskan sebagai berikut:
(defun faktorial (x)
(if (eql x 0)
1
(* x faktorial (- x 1)))))
Form
Form adalah sesuatu yang akan dievaluasi/dicari nilainya. Form dapat berupa atom (non-list) maupun list.
Evaluasi form sangatlah sederhana jika yang terlibat adalah atom. Jika atom yang bersangkutan adalah angka (misalnya 100, -5, 3/4, 0.333), maka hasil evaluasinya adalah angka itu sendiri (disebut self-evaluating). Inilah beberapa contohnya (langsung saja anda coba pada CLISP):
> 100 (ini adalah input)
] 100 (ini adalah outputnya)
> 3/4
] 3/4
> -2.71828
] -2.71828
Kita bisa melihat bahwa Lisp memiliki beberapa tipe data angka. Yang pertama adalah integer, yang dapat menyimpan bilangan bulat sebesar atau sekecil apapun (hanya dibatasi oleh kapasitas memori yang ada). Tipe data lainnya adalah rational, yang berupa p/q dengan p dan q integer dan q lebih besar dari 1 (jika q = 1 maka bilangannya akan menjadi integer). Rational juga hanya dibatasi oleh memori yang tersedia. Tipe data ketiga adalah floating point, yang melambangkan angkanya menggunakan mantissa and eksponen. Floating point pasti dituliskan dengan tanda titik. Jadi 1 adalah integer sedangkan 1.0 adalah floating point. Pada tipe data floating point dapat terjadi underflow (jika nilai mutlak pecahannya terlalu kecil) maupun overflow (jika nilai mutlak angkanya terlalu besar). Inilah beberapa contohnya: