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?
Jawaban:
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:
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.
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.
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.
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 .
sumber
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.
sumber
Saya dapat merekomendasikan Common Lisp di SBCL . Kombinasi ini cepat, kuat, matang, dan terdokumentasi dengan baik.
sumber
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.
sumber
Saya lebih suka CL, karena saya suka pemrograman berorientasi objek, dan CLOS adalah sistem objek terbaik.
sumber
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.
sumber
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.
sumber
LFE (Lisp Flavored Erlang) akan menyenangkan. Anda dapat memiliki sintaks cadel di atas VM Erlang.
sumber
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.
sumber