Pertanyaan Clojure vs Lisps lainnya [tertutup]


Maksud dari pertanyaan saya adalah tidak untuk memulai perang api, tetapi untuk menentukan dalam keadaan apa setiap bahasa adalah "alat terbaik untuk pekerjaan itu."

Saya telah membaca beberapa buku tentang Clojure (Pemrograman Clojure, Clojure Praktis, The Joy of Clojure, dan edisi Akses Awal Manning dari Clojure in Action), dan saya pikir itu adalah bahasa yang fantastis. Saya sedang membaca Biarkan Lebih Lambda yang sebagian besar berhubungan dengan macro Common Lisp, dan, itu juga, adalah bahasa yang sangat menarik.

saya tidak seorang ahli Lisp (lebih dari seorang pemula), tetapi keluarga bahasa ini mempesona saya, seperti halnya pemrograman fungsional, secara umum.

Keuntungan dari Clojure (dan kerugian "orang lain"):

  • Berjalan di JVM.

    • JVM adalah lingkungan bahasa yang sangat stabil dan berkinerja tinggi yang cukup baik memenuhi impian Sun "Tulis sekali, jalankan [hampir] di mana saja". Saya dapat menulis kode pada Macbook Pro saya, mengkompilasinya ke file JAR yang dapat dijalankan, dan kemudian menjalankannya di Linux dan Microsoft Windows dengan sedikit pengujian tambahan.

    • The (Hotspot, dan lainnya) JVM mendukung pengumpulan sampah berkualitas tinggi dan kompilasi dan pengoptimalan tepat waktu yang sangat tepat waktu. Di mana hanya beberapa tahun yang lalu, saya menulis semua yang harus berjalan cepat di C, sekarang saya tidak ragu untuk melakukannya di Jawa.

    • Model standar, sederhana, multithreading. Apakah Common Lisp memiliki paket multithreading standar?

    • Memecah monoton dari semua tanda kurung itu [], {}, dan #{}, meskipun pakar Common Lisp mungkin akan memberi tahu saya bahwa dengan makro pembaca, Anda dapat menambahkannya ke CL.

Kerugian dari Clojure:

  • Berjalan di JVM.
    • Tidak ada rekursi atau kelanjutan ekor. Apakah Common Lisp mendukung kelanjutan? Skema membutuhkan dukungan untuk keduanya, saya percaya.

Keuntungan Orang Lain (Common Lisp, khususnya) (dan kerugian dari Clojure):

  • Makro pembaca pengguna-didefinisikan.

  • Keunggulan lainnya?

Pikiran? Perbedaan lainnya?


76


asal


Jawaban:


Daftar pribadi saya alasan untuk memilih Clojure ke Lisps lainnya (p.s.Saya masih berpikir semua Lisps hebat!):

  • Berjalan di JVM - maka mendapat akses otomatis ke rekayasa fantastis di JVM itu sendiri (algoritma pengumpulan sampah canggih, optimasi HotSpot JIT dll)

  • Java interoperability yang sangat baik - menyediakan kompatibilitas dengan sejumlah besar perpustakaan di ekosistem bahasa Java / JVM. Saya telah menggunakan Clojure sebagai bahasa "lem" untuk menghubungkan pustaka Java yang berbeda dengan efek yang baik. Karena saya juga mengembangkan banyak kode Java, sangat membantu bagi saya bahwa Clojure terintegrasi dengan baik dengan perkakas Java (misalnya saya menggunakan Maven, Eclipse dengan plugin Counterclockwise untuk pengembangan Clojure saya)

  • Sintaks yang bagus untuk vektor [1 2 3], peta {:bob 10, :jane 15} dan set #{"a" "b" "c"} - Saya menganggap ini alat yang sangat penting untuk pemrograman modern (selain daftar tentu saja!)

  • Saya pribadi menyukai penggunaan tanda kurung siku untuk bentuk pengikatan: misalnya (defn foo [a b] (+ a b)) - Saya pikir itu membuat kode sedikit lebih jelas untuk dibaca.

  • Penekanan pada malas, pemrograman fungsional dengan struktur data yang tetap dan tidak berubah - khususnya semua perpustakaan inti Clojure dirancang untuk mendukung ini secara default

  • Penerapan STM yang sangat baik untuk konkurensi multi-inti. Saya percaya Clojure memiliki kisah konkurensi terbaik dalam bahasa apa pun saat ini (lihat ini video untuk elaborasi lebih oleh Rich Hickey sendiri)

  • Ini adalah Lisp-1 (seperti Skema), yang saya pribadi sukai (saya pikir dalam bahasa fungsional masuk akal untuk menyimpan fungsi dan data dalam ruang nama yang sama)


44



Perbedaan penting antara Clojure dan Common Lisp adalah bahwa Clojure lebih bersifat preskriptif tentang pemrograman fungsional. Filosofi, idiom, dan bahasa tertentu dari Clojure / libraries sangat mendorong dan terkadang memaksa Anda memprogram dengan cara yang fungsional (tidak ada efek samping, tidak ada kondisi yang bisa berubah).

Common Lisp pasti mendukung pemrograman fungsional, tetapi juga memungkinkan keadaan yang bisa berubah dan pemrograman imperatif.

Tentu saja, ada sejumlah manfaat untuk pemrograman fungsional, di bidang konkurensi dan sebaliknya. Tetapi semua yang lain sama, juga baik untuk memiliki pilihan pendekatan mana yang ingin Anda gunakan untuk setiap situasi. Clojure tidak sepenuhnya melarang pemrograman imperatif, tetapi kurang mengakomodasi gaya itu daripada Common Lisp.


23



Perlu diingat bahwa Clojure adalah bahasa dan implementasi (biasanya di JVM). Common Lisp adalah bahasa dengan lebih dari sepuluh implementasi berbeda. Jadi kami memiliki kategori tidak cocok di sini. Anda mungkin misalnya membandingkan Clojure dengan SBCL.

Umumnya:

  • versi Common Lisp berjalan di JVM: ABCL

  • kebanyakan implementasi Common Lisp lainnya tidak

  • kebanyakan implementasi CL memiliki kemampuan multitasking, perpustakaan menyediakan antarmuka umum

  • Common Lisp memiliki sintaks untuk array. Sintaks untuk tipe data lain dapat ditulis oleh pengguna dan disediakan oleh berbagai pustaka.

  • Common Lisp tidak mendukung pengoptimalan atau penyambungan panggilan ekor. Implementasi menyediakan TCO dan pustaka menyediakan beberapa bentuk kelanjutan.


19



Ini video yang bagus dengan perbandingan Skema (Raket sebagian besar) dan Clojure.

Agar adil, Racket memiliki gula sintaks (barang pembaca tambahan) untuk tipe data juga (#hash, #, tanda kurung siku, dll.)

Plus, satu-satunya cara Clojure untuk membuat panggilan ekor yang tepat adalah dengan menggunakan recur, itulah kelemahan kompilasi ke JVM.

Perhatikan itu recur adalah satu-satunya konstruksi perulangan yang tidak memakan tumpukan di Clojure. Tidak ada panggilan ekor   optimalisasi dan penggunaan panggilan mandiri untuk pengulangan batas yang tidak dikenal tidak disarankan. recur aku s   fungsional dan penggunaannya dalam posisi ekor diverifikasi oleh kompilator. (Formulir Khusus).


10