1) Konsep variabel baru. Dalam Lisp, semua variabel adalah pointer efektif. Nilai adalah apa yang memiliki tipe, bukan variabel, dan penugasan atau variabel mengikat berarti menyalin pointer, bukan apa yang mereka tunjuk.
(defun print-twice (it)
(print it)
(print it))
'it' adalah variabel. Itu bisa terikat dengan nilai APA SAJA. Tidak ada batasan dan tidak ada tipe yang terkait dengan variabel. Jika Anda memanggil fungsi, argumen tidak perlu disalin. Variabelnya mirip dengan pointer. Ini memiliki cara untuk mengakses nilai yang terikat ke variabel. Tidak perlu menyimpan memori. Kita dapat melewatkan objek data apa pun ketika kita memanggil fungsi: ukuran apa pun dan jenis apa pun.
Objek data memiliki 'tipe' dan semua objek data dapat di-query untuk 'tipenya'.
(type-of "abc") -> STRING
2) Jenis simbol. Simbol berbeda dari string karena Anda dapat menguji kesetaraan dengan membandingkan sebuah pointer.
Simbol adalah objek data dengan nama. Biasanya nama dapat digunakan untuk menemukan objek:
|This is a Symbol|
this-is-also-a-symbol
(find-symbol "SIN") -> SIN
Karena simbol adalah objek data nyata, kita dapat menguji apakah mereka adalah objek yang sama:
(eq 'sin 'cos) -> NIL
(eq 'sin 'sin) -> T
Sebagai contoh, ini memungkinkan kita untuk menulis kalimat dengan simbol:
(defvar *sentence* '(mary called tom to tell him the price of the book))
Sekarang kita dapat menghitung jumlah THE dalam kalimat:
(count 'the *sentence*) -> 2
Dalam Common Lisp simbol tidak hanya memiliki nama, tetapi mereka juga dapat memiliki nilai, fungsi, daftar properti, dan paket. Jadi simbol dapat digunakan untuk memberi nama variabel atau fungsi. Daftar properti biasanya digunakan untuk menambahkan meta-data ke simbol.
3) Notasi untuk kode menggunakan pohon simbol.
Lisp menggunakan struktur data dasar untuk mewakili kode.
Daftar (* 3 2) dapat berupa data dan kode:
(eval '(* 3 (+ 2 5))) -> 21
(length '(* 3 (+ 2 5))) -> 3
Pohon:
CL-USER 8 > (sdraw '(* 3 (+ 2 5)))
[*|*]--->[*|*]--->[*|*]--->NIL
| | |
v v v
* 3 [*|*]--->[*|*]--->[*|*]--->NIL
| | |
v v v
+ 2 5
4) Seluruh bahasa selalu tersedia. Tidak ada perbedaan nyata antara waktu baca, waktu kompilasi, dan runtime. Anda dapat mengkompilasi atau menjalankan kode saat membaca, membaca atau menjalankan kode saat kompilasi, dan membaca atau mengkompilasi kode saat runtime.
Lisp menyediakan fungsi BACA untuk membaca data dan kode dari teks, LOAD untuk memuat kode, EVAL untuk mengevaluasi kode, COMPILE untuk mengkompilasi kode dan PRINT untuk menulis data dan kode ke teks.
Fungsi-fungsi ini selalu tersedia. Mereka tidak pergi. Mereka dapat menjadi bagian dari program apa pun. Itu berarti setiap program dapat membaca, memuat, mengevaluasi atau mencetak kode - selalu.
Bagaimana mereka berbeda dalam bahasa seperti C atau Java?
Bahasa-bahasa itu tidak memberikan simbol, kode sebagai data, atau evaluasi runtime data sebagai kode. Objek data dalam C biasanya tidak diketik.
Apakah ada bahasa lain selain bahasa keluarga LISP yang memiliki konstruksi ini sekarang?
Banyak bahasa memiliki beberapa kemampuan ini.
Perbedaan:
Dalam Lisp, kemampuan ini dirancang ke dalam bahasa sehingga mudah digunakan.