Dialek Lisp mana yang harus saya pelajari? [Tutup]

89

Saya tahu ada beberapa dialek Lisp yang berbeda. Setelah memutuskan bahwa belajar Lisp akan menjadi pengalaman intelektual baru, saya ingin tahu dialek Lisp mana yang harus dipelajari, dan mengapa.

Apakah ada yang lebih populer dari yang lain? Apakah salah satu dari mereka lebih "lengkap", seperti pada, didokumentasikan dan didukung dengan lebih baik? Apa pro dan kontra dari dialek ini?

Humphrey Bogart
sumber
Saya melakukan pencarian sebelum saya menanyakan ini tetapi sifat pertanyaan berevolusi saat saya mengetiknya. Saya akan memastikan untuk tidak menemukan kembali roda.
Humphrey Bogart
Jadi apa perbedaan antara pertanyaan ini dan pertanyaan yang disebutkan Greg di atas?
cjs
2
Saya pikir, apa yang dia coba katakan adalah: Ketika saya pertama kali merumuskan pertanyaan saya dalam pikiran saya, itu benar-benar berbeda dari yang sekarang, dan melihat pertanyaan dalam pencarian terkait tidak mengungkapkan apa pun yang sesuai dengan apa yang dia inginkan meminta. Tetapi pada saat dia mengetik pertanyaannya, pertanyaan itu telah berubah dan dengan demikian tiba di SO dalam bentuknya saat ini, yang ditanyakan sebelumnya.
J. Polfer

Jawaban:

77

Anda ingin mencari keseimbangan antara kesederhanaan dan kebersihan, fitur menarik, dan platform yang memungkinkan Anda menulis perangkat lunak yang menarik dan berguna (untuk diri Anda sendiri) serta berfungsi sebagai alat pembelajaran. (Yang terakhir ini akan membuat Anda terus maju dan belajar lebih lama.) Berikut beberapa kemungkinannya:

  1. Skema. Mungkin dialek terbersih dari semua. Tidak diragukan lagi mengapa The Little Schemer diterjemahkan dari LISP ke dalam Skema. Spesifikasi standar Skema kelima, R5RS , adalah pendidikan yang luar biasa dalam dan dari dirinya sendiri; ini mungkin bahasa terbaik dan spesifikasi pustaka yang pernah saya baca, serta yang terpendek yang cukup komprehensif. The PLT Skema (sekarang Racket) platform termasuk juru cukup layak dan compiler, baik untuk scripting, dan juga memiliki beberapa alat visual yang membuatnya sangat baik untuk belajar.

  2. Lisp umum. Mungkin varian yang paling portabel dan komprehensif, ini kemungkinan besar yang Anda inginkan jika Anda ingin menulis sesuatu seperti perangkat lunak komersial. Standar mendefinisikan pustaka ekstensif, dan banyak lagi yang tersedia di luar itu, ia memiliki CLOS , yang mungkin akan mengajarkan Anda lebih banyak tentang OO daripada bahasa OO mana pun, dan beberapa kompilernya sangat bagus. Kekurangan termasuk beberapa kutil yang tidak dimiliki Skema (seperti memiliki ruang nama terpisah untuk variabel yang merujuk ke fungsi), tidak bersih dan sederhana (seperti halnya dengan apa pun yang harus memiliki ekstensi dan membuat kompromi diperlukan untuk aplikasi besar di dunia nyata), tidak memiliki makro yang higienis, dan lebih sedikit menekankan rekursi daripada Skema.

  3. Clojure.Ini berjalan di JVM, yang mungkin memberikannya kaki di sana untuk pengembang Java. Ada beberapa kutukan (misalnya, Anda harus secara eksplisit meminta optimasi panggilan ekor, meskipun ini dapat berubah suatu hari jika TCO ditambahkan ke JVM). Makro, meskipun tidak higienis, memiliki beberapa fitur untuk membantu Anda menghindari pengambilan variabel, sehingga Anda dapat menangkap variabel jika Anda benar-benar menginginkannya, sambil menjalankan risiko lebih kecil untuk tidak sengaja melakukannya daripada di CL. Anda memiliki akses mudah ke semua perpustakaan Java; itu mungkin hal yang baik untuk kode "dunia nyata", dan cukup tidak berguna dalam hal pembelajaran. Ia memiliki satu set pustaka untuk struktur data persisten dan dukungan untuk STM, yang membuatnya sangat menarik dari sudut pandang yang bersamaan; ini membuatnya mungkin taruhan terbaik Anda jika Anda ' tertarik untuk mempelajari lebih lanjut tentang metode baru dalam menangani pemrograman bersamaan dan paralel. Tampaknya Clojure dapat digunakan untuk aplikasi produksi yang besar seperti Java, dalam arti bahwa Clojure akan memiliki kemampuan untuk melakukan "hal-hal buruk" yang Anda lakukan dalam aplikasi produksi yang lebih suka tidak Anda lakukan dan tidak lakukan saat Anda sedang belajar.

  4. Emacs Lisp. Dalam hal LISP, ini bukan salah satu contoh yang lebih baik di luar sana. Salah satu kesalahan terbesarnya adalah dynamic scoping, tetapi ada banyak kesalahan lainnya. Namun, jika Anda adalah pengguna Emacs, ini mungkin alat paling ampuh yang dapat Anda pelajari untuk meningkatkan penggunaan editor Anda. Berapa banyak yang benar-benar Anda pelajari dari mempelajari Emacs Lisp, selain bagaimana mengembangkan Emacs, bagi saya merupakan pertanyaan terbuka; Saya tidak tahu seberapa sering teknik menarik seperti fungsi tingkat tinggi benar-benar digunakan di Emacs Lisp.

Pembaruan 2018

Sudah hampir satu dekade sejak saya menulis posting ini dan keluarga bahasa Lisp sekarang tampaknya mendapatkan daya tarik yang signifikan dalam kesadaran programmer umum. Sebagian besar tampaknya terkait dengan Clojure yang tidak hanya menjadi dialek Lisp yang terpisah dengan benar, memperkenalkan banyak ide bagusnya sendiri, tetapi juga sekarang memiliki versi yang hampir identik yang menargetkan JavaScript dan telah menginspirasi banyak Lisps lainnya. menargetkan platform lain. Misalnya, Hy menargetkan CPython AST dan bytecode, yang bertujuan pertama untuk interoperabilitas dengan Python, tetapi menggunakan ide Clojure "jika ragu." (Meskipun dari commit terbaru, yang terakhir mungkin berubah sedikit.)

Perubahan besar yang dibawa dalam proses pengambilan keputusan Anda adalah bahwa Anda juga harus melihat bahasa Lisps atau Lisp apa pun yang tersedia dan bekerja sama dengan bahasa atau platform yang sudah Anda gunakan, baik itu Perl , Ruby , Erlang , Go atau bahkan C ++ pada mikrokontroler .

cjs
sumber
3
Memiliki ruang nama terpisah bukanlah kutukan, itu hanya keputusan desain yang berbeda. Perlu diingat bahwa sudah ada beberapa namespace lain juga di Skema, jadi perdebatannya agak Lisp-5 melawan Lisp-6. Terlepas dari kemudahan yang dapat saya sebut daftar "daftar" dan mobil "mobil" di CL, sistem makronya jauh lebih praktis dan berguna, karena penyusun tidak membingungkan banyak hal dengan mudah.
Svante
Clojure tidak memiliki pengoptimalan panggilan ekor, dan tidak bisa, karena bytecode JVM tidak mendukungnya. Yang dimilikinya hanyalah bentuk khusus "berulang" yang mengulang kembali fungsi saat ini.
Svante
3
Curt: Saya berpendapat bahwa Clojure adalah yang paling portabel karena berjalan pada Java VM.
justinhj
1
Saya tidak tahu tentang itu; jika Anda mengecualikan perangkat kecil dan tertanam (seperti telepon dan kartu pintar) di mana Anda tidak akan menjalankan program desktop / server yang tidak dimodifikasi, elisp pasti berjalan pada lebih banyak CPU dan platform daripada JVM.
cjs
1
Saya sangat tidak setuju. Rekursi cenderung menghasilkan kode yang a) lebih murni, b) lebih mudah diverifikasi, c) lebih cenderung benar. Secara lebih rinci: a) cenderung kurang menyentuh lebih sedikit variabel di luar fungsi; b) bukti induktif cenderung secara alami keluar dari fungsi rekursif, sedangkan dengan loop Anda perlu memeriksa invarian loop, dll.; c) keandalan berasal dari a) dan bahwa Anda cenderung didorong untuk membuat kode dengan cara yang secara alami membuat Anda melakukan (mungkin secara informal) bukti induktif dari b).
cjs
22

Saya akan mengatakan Skema, semata-mata karena Si Perencana Kecil , yang merupakan salah satu buku paling mengasyikkan namun sangat sulit yang pernah saya coba baca.

J. Polfer
sumber
15
Jangan lupa SICP! mitpress.mit.edu/sicp . Ini adalah bacaan klasik.
Joris Timmermans
7
Ada dua atau tiga edisi The Little Lisper sebelum The Little Schemer keluar sebagai terjemahannya.
cjs
9

Saya dapat merekomendasikan Common Lisp di SBCL . Kombinasi ini cepat, kuat, matang, dan terdokumentasi dengan baik.

Leslie P. Polzer
sumber
8

Juga Clojure semakin banyak berbagi pikiran hari ini, dan untuk alasan yang bagus. Struktur data yang bagus, dukungan konkurensi yang sangat baik (membuat Skema dan CL menjadi malu dalam hal ini), dan komunitas yang hebat. Ini juga relatif sederhana, CL setidaknya serumit C ++.

Ini bukan untuk mengatakan saya tidak menikmati CL atau Scheme. Saya belajar Skema dengan SICP. Dan CL membawaku ke Clojure. Itu semua tergantung pada tujuan Anda, saya kira. Jika Anda ingin mempelajari Lisp yang sangat praktis, gunakan Clojure. Jika CL atau Skema keduanya bagus.

dnolen
sumber
Ini tampaknya menyiratkan bahwa baik CL atau Skema "sangat praktis", padahal mereka cukup praktis. Terutama standar CL lahir dari pertimbangan praktis.
Leslie P. Polzer
2
Lanskap bahasa pemrograman telah berubah sejak tahun 1994, saya tidak tahu bagaimana standar CL akan berubah / berkembang untuk mengakomodasi apa yang telah dipelajari sejak saat itu. Dunia bergerak maju dan sejauh yang saya tahu CL masih berdiri diam. Saya suka CL, Clojure memiliki beberapa cara untuk mendekati kekuatannya, tapi saya tidak melihat bagaimana CL akan berkembang- jika Anda akan menggunakan bahasa standar, jalur evolusi harus terlihat. Tanpanya, suatu bahasa kemungkinan besar bukanlah pilihan yang praktis.
dnolen
4
CL telah berkembang dan berkembang melalui banyak perpustakaan yang sangat berguna. Bahasa dasar sudah lebih kuat pada tahun 1994 daripada semua bahasa "modern" saat ini.
Svante
5

Saya lebih suka CL, karena saya suka pemrograman berorientasi objek, dan CLOS adalah sistem objek terbaik.

jrockway
sumber
5
Berbicara tentang CL, saya akan merekomendasikan ClozureCL atau SBCL. Keduanya open source, terdokumentasi dengan baik, matang, multi-platform, dan menyediakan fungsionalitas non-standar penting seperti multithreading.
Daniel Dickison
5

Saya belajar Skema di sekolah. Itu adalah pengalaman belajar yang luar biasa dan saya tidak akan pernah melupakan dasar-dasar pemrograman fungsional. Mungkin tidak masalah versi LISP mana yang Anda gunakan, selama Anda memahami inti kegunaannya - kalkulus lambda tanpa negara.

Berikut adalah artikel menarik tentang Mengapa MIT beralih dari Skema ke Python dalam kursus pengantar pemrogramannya.

jinsungy
sumber
3

Saya akan mengatakan semuanya, setidaknya pada awalnya. Akhirnya Anda mungkin akan mengembangkan preferensi untuk Skema atau Lisp Umum, tetapi keduanya memiliki perbedaan yang cukup sehingga yang terbaik adalah menangani semua yang ada di luar sana.

Skema memiliki kelanjutan misalnya, dan bagus untuk mempelajari tentang Skema, meskipun mereka dapat diterapkan di Common Lisp.

Mempelajari perbedaan antara lingkup leksikal dan dinamis itu penting, dan jika Anda mempelajari Common Lisp dan elisp, Anda akan menemukan implikasi dari keduanya.

justinhj
sumber
0

LFE (Lisp Flavored Erlang) akan menyenangkan. Anda dapat memiliki sintaks cadel di atas VM Erlang.


sumber
0

Semacam pertanyaan yang "dimuat" untuk memulai tapi OP mungkin tidak mengetahuinya. Umumnya, daftar Umum dan Skema seperti "orang" komputer PC dan Apple, mereka tidak bercampur. Mana yang terbaik mungkin tidak serelevan mana yang "berhasil" untuk Anda. Sungguh, tidak banyak perbedaan. Kemungkinan preferensi untuk salah satu dari yang lain mungkin dipengaruhi oleh mana yang Anda pelajari terlebih dahulu. (Bagi saya, daftar kosong harus "tidak ada", yang dikenal di CL sebagai NIL, dan itu membuat saya menjadi Common Lisper.) Saya suka integrasi SBCL dengan Slime menggunakan EMACS, tetapi SBCL bukan untuk semua orang. Untuk satu hal, SBCL sangat ketat. Jika Anda hanya ingin "bersenang-senang", GNU clisp mudah dan tersedia untuk hampir semua platform.

Wiley
sumber