Apa perbedaan antara Lisp-1 dan Lisp-2?

95

Saya telah mencoba untuk memahami perbedaan antara Lisp-1 dan Lisp-2 dan bagaimana kaitannya dengan Clojure tetapi saya masih belum mengerti dengan benar. Adakah yang bisa mencerahkan saya?

appshare.co
sumber

Jawaban:

69

Menurut wikipedia :

Apakah namespace terpisah untuk fungsi merupakan keuntungan adalah sumber perselisihan di komunitas Lisp. Ini biasanya disebut sebagai debat Lisp-1 vs Lisp-2. Lisp-1 mengacu pada model Skema dan Lisp-2 mengacu pada model Common Lisp.

Ini pada dasarnya tentang apakah variabel dan fungsi dapat memiliki nama yang sama tanpa bentrok. Clojure adalah Lisp-1 yang berarti bahwa ia tidak mengizinkan nama yang sama digunakan untuk fungsi dan variabel secara bersamaan.

pauldoo
sumber
11
Bukankah Lisp-2 lebih membingungkan memiliki fungsi dan variabel dengan nama yang sama?
appshare.co
39
Sebagian alasannya adalah bahwa programmer yang menggunakan dialek Lisp-2 tidak berusaha untuk memiliki fungsi dan variabel yang memiliki nama yang sama. listsering digunakan sebagai parameter fungsi dan tidak ada hal, OMG yang sangat membingungkan karena (list ...)merupakan fungsi standar. Banyak fungsi yang memiliki listvariabel tidak menggunakan listfungsi tersebut, atau tidak menggunakannya di dekat variabel tersebut. Bahkan ketika itu tidak terjadi itu tidak terlalu buruk: (list foo list). Ini tidak lebih membingungkan daripada kalimat seperti "pertarungan yang baik" di mana kata yang sama muncul sebagai kata benda dan kata kerja.
Kaz
5
@Zubair Java memiliki lebih banyak ruang nama. Anda dapat menentukan kelas, metode, dan variabel dengan nama yang sama.
ceving
20
Sebagai mnemonik, saya menganggap Lisp 1s memiliki 1 namespace, dan Lisp 2s memiliki 2 namespace (satu untuk fungsi dan satu untuk variabel).
Nick McCurdy
4
@NickMcCurdy Sebagai sebuah mnemonic, menurut saya sepeda memiliki dua roda, dan roda tiga memiliki tiga.
Kaz
72

Anda mungkin ingin membaca makalah ini oleh Richard Gabriel. Ini adalah ringkasan dari isu-isu yang dibahas komunitas Lisp di Lisp1 vs Lisp2. Agak padat dan lambat bergerak di beberapa bagian pertama, tetapi jauh lebih mudah dibaca saat Anda melewati bagian 5.

Pada dasarnya, Lisp1 memiliki satu lingkungan yang memetakan simbol ke nilai, dan nilai tersebut dapat berupa "biasa" atau fungsi. Lisp2 memiliki (setidaknya) dua ruang nama (simbol memiliki slot untuk nilai fungsinya dan satu untuk nilai reguler). Jadi, di Lisp2, Anda dapat memiliki fungsi bernama foo dan nilai bernama foo, sedangkan di Lisp1, nama foo hanya dapat merujuk ke satu nilai (fungsi atau sebaliknya).

Ada beberapa pengorbanan dan perbedaan rasa di antara keduanya, tetapi bacalah makalah untuk detailnya. Buku Christian Queinnec, "Lisp in Small Pieces" juga membahas perbedaan yang terjalin melalui teks.

Peter McLain
sumber
7
Salah satu bagian yang lebih misterius dari makalah Gabriel, adalah bagian 11 tentang Multiprocessing. Dalam bagian itu, ia menyiratkan bahwa Lisp1 lebih kondusif untuk gaya pemrograman fungsional, sehingga lebih kondusif untuk multiprosesing. Jelas, ini menarik perhatian Clojure. Tapi saya tidak begitu yakin mengapa Lisp1 lebih kondusif untuk FP. Ada yang punya wawasan tentang ini?
Peter McLain
41
mungkin karena poin utama FP adalah memperlakukan fungsi sebagai nilai kelas satu, oleh karena itu jauh lebih nyaman dan lebih bersih secara konseptual untuk memperlakukannya dengan cara yang sama seperti semua nilai lainnya
mikera
10
@PeterMcLain Ketika pengguna dialek Lisp-1 mengatakan bahwa Lisp-1 lebih konduktif untuk pemrograman fungsional, yang mereka maksud adalah Anda tidak perlu mengisi penuh kode funcalldan functionoperator. Ini menghilang di Lisp-1.
Kaz
3
Contoh apa yang terjadi ketika seorang Schemer mencoba menulis Lisp: emacs.stackexchange.com/q/28979/2787
ceving
2
Anda menggunakan frasa "setidaknya" tentang Lisp-2. Perbedaan sederhana antara 2 kasus tersebut adalah: apakah simbol berada di posisi kepala ekspresi-s, atau tidak (jika demikian, maka cari di namespace fungsi, atau di namespace variabel). Dapatkah Anda memberikan beberapa contoh selain 2 kasus tersebut?
Daniel Dinnyes