Apa perbedaan antara Clojure, Scheme / Racket dan Common Lisp?

120

Saya tahu itu adalah dialek dari rumpun bahasa yang sama yang disebut cadel, tetapi apa sebenarnya perbedaannya? Bisakah Anda memberikan gambaran umum, jika memungkinkan, mencakup topik seperti sintaksis, karakteristik, fitur, dan sumber daya.

MaiaVictor
sumber
3
Saya meminta gambaran umum yang lebih umum tentang perbedaan karena menurut saya pertanyaan ini bisa bermanfaat bagi banyak orang lain, maaf jika terdengar kasar.
MaiaVictor
4
Saya selalu bingung posting mana yang harus pergi kemana. Ini adalah diskusi tentang alat, jadi apakah ini pertanyaan untuk di sini atau pemrogram? Logikanya, menurut saya pindahkan ke programmer, karena ini tidak meminta untuk memecahkan masalah tertentu, tetapi ini adalah posting yang bagus dengan jawaban yang bagus IMHO.
octopusgrabbus
1
@octopusgrabbus: pertanyaannya terlalu luas. Membandingkan tiga bahasa pemrograman pada 'sintaks, karakteristik, fitur, dan sumber daya' dapat dengan mudah mengisi buku atau situs web. Stackoverflow adalah untuk orang-orang yang memiliki masalah pemrograman, ini bukan ensiklopedia (Wikipedia), ini bukan forum diskusi umum (Usenet), ini bukan situs perbandingan bahasa ( rosettacode.org ). Cara terbaik adalah untuk masalah pemrograman nyata di mana pertanyaannya memiliki kode dan jawaban memiliki kode juga. Plus: Jangan mengarang masalah hanya karena seseorang bosan atau itu hobi.
Rainer Joswig
3
Hanya karena pertanyaannya luas tidak berarti itu tidak termasuk di sini. Ini adalah pertanyaan yang sangat jelas , dan tentunya merupakan "pertanyaan pemrograman yang sebenarnya". StackOverflow dimaksudkan terutama sebagai sumber daya komunitas [yang dapat di-google] untuk berbagi pengetahuan tentang pemrograman melalui format Tanya Jawab.
Dan Burton
@RainerJoswig, saya bisa saja menulis semua yang saya pelajari tentang bahasa-bahasa itu pada hari-hari terakhir saya mempelajarinya, tetapi itu akan membuat utasnya menjadi besar. Itu sangat buruk ketika Anda menyadari orang akan mencari di Google kalimat pendek semacam itu dan tidak akan bisa mendapatkan jawabannya karena teks besar menghalangi mereka untuk memahami dengan cepat apa yang ditanyakan. Melakukan cara ini memastikan lebih banyak orang akan terbantu dengan jawaban yang bagus.
MaiaVictor

Jawaban:

103

Mereka semua memiliki banyak kesamaan:

  • Bahasa dinamis
  • Diketik dengan kuat
  • Disusun
  • Sintaks gaya Lisp, yaitu kode ditulis sebagai struktur data Lisp (formulir) dengan pola yang paling umum adalah pemanggilan fungsi seperti: (function-name arg1 arg2)
  • Sistem makro canggih yang memungkinkan Anda memperlakukan kode sebagai data dan membuat kode arbitrer pada waktu proses (sering kali digunakan untuk "memperluas bahasa" dengan sintaks baru atau membuat DSL)
  • Sering digunakan dalam gaya pemrograman fungsional, meskipun memiliki kemampuan untuk mengakomodasi paradigma lain
  • Penekanan dalam pengembangan interaktif dengan REPL (yaitu Anda mengembangkan secara interaktif dalam contoh kode yang berjalan)

Fitur khas Lisp umum:

Ciri khas Clojure:

  • Ekosistem perpustakaan terbesar, karena Anda dapat langsung menggunakan perpustakaan Java apa pun
  • Vektor []dan peta {}digunakan sebagai standar selain daftar standar ()- selain kegunaan umum vektor dan peta, beberapa orang percaya ini adalah inovasi yang membuat umumnya lebih mudah dibaca
  • Penekanan yang lebih besar pada keabadian dan pemrograman fungsional malas, agak terinspirasi oleh Haskell
  • Kemampuan konkurensi yang kuat yang didukung oleh memori transaksional perangkat lunak di tingkat bahasa (patut diperhatikan: http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey )

Fitur khas skema:

  • Bisa dibilang Lisp paling sederhana dan termudah untuk dipelajari
  • Makro higienis (lihat http://en.wikipedia.org/wiki/Hygienic_macro ) - dengan elegan menghindari masalah dengan pengambilan simbol yang tidak disengaja dalam perluasan makro
mikera
sumber
11
ini bagus, tetapi mungkin Anda harus menyebutkan bahwa raket lebih dari sekedar skema "; ini adalah sistem yang mendukung banyak bahasa (tetapi terkait) (Anda bahkan dapat menentukan bahasa Anda sendiri). Selain itu, clojure memiliki berbagai cara untuk melakukan pemrograman mirip-oo (baik pendekatan pengiriman ganda agak mirip dengan clos dan sesuatu yang lebih dekat ke java yang lebih efisien di jvm). dan skema mengarah ke pustaka yang lebih standar (yang juga mencakup oo) dengan r6rs, yang mendukung raket.
andrew cooke
2
"Bahasa dinamis yang diketik dengan kuat" adalah pemasaran. Dalam pengertian ini, bahkan Python diketik dengan kuat.
ron
16
@ron: Python adalah sangat diketik, seperti Lisp (tidak seperti misalnya Javascript atau VB). Anda malah memikirkan "pengetikan statis" vs "pengetikan dinamis", lihat en.wikipedia.org/wiki/Type_system untuk semua varietas. Tapi ya, ini pemasaran
Nas Banov
2
Saya juga berpikir Racket akan bagus untuk ditambahkan ke jawaban ini. Saya pikir Racket lebih mudah dipelajari daripada Skema karena komunitas dan fokus bahasanya. Racket (sebelumnya bernama PLT Scheme) adalah tujuan umum, bahasa pemrograman multi-paradigma dalam keluarga Lisp / Scheme. Salah satu tujuan desainnya adalah berfungsi sebagai platform untuk pembuatan, desain, dan implementasi bahasa.
mtelesha
Clojure memiliki makro yang higienis. Info lebih lanjut di sini: xivilization.net/~marek/blog/2013/09/17/…
Christopher Kuttruff
50

Orang-orang di atas melewatkan beberapa hal

  1. Lisp umum memiliki vektor dan tabel hash juga. Perbedaannya adalah Common Lisp menggunakan # () untuk vektor dan tidak ada sintaks untuk tabel hash. Skema memiliki vektor, saya yakin

  2. Common Lisp memiliki makro pembaca, yang memungkinkan Anda menggunakan tanda kurung baru (seperti halnya Racket, turunan Skema).

  3. Scheme dan Clojure memiliki makro higienis, berbeda dengan makro Common Lisp yang tidak higienis

  4. Semua bahasanya modern atau memiliki proyek renovasi besar-besaran. Common Lisp telah mendapatkan perpustakaan yang luas dalam lima tahun terakhir (sebagian besar berkat Quicklisp), Skema memiliki beberapa implementasi modern (Racket, Chicken, Chez Scheme, dll.), Dan Clojure dibuat relatif baru

  5. Common Lisp memiliki sistem OO bawaan, meskipun sangat berbeda dari sistem OO lain yang mungkin pernah Anda gunakan. Khususnya, ini tidak dipaksakan - Anda tidak perlu menulis kode OO.

  6. Bahasa-bahasa tersebut memiliki filosofi desain yang agak berbeda. Skema dirancang sebagai dialek minimal untuk memahami Model Aktor; itu kemudian digunakan untuk pedagogi. Common Lisp dirancang untuk menyatukan berbagai dialek Lisp yang bermunculan. Clojure dirancang untuk konkurensi. Akibatnya, Skema memiliki reputasi minimal dan elegan, Common Lisp kuat dan paradigma-agnostik (fungsional, OO, apa pun), dan Clojure menyukai pemrograman fungsional.

Cosman 246
sumber
4
Racket bukanlah implementasi Skema, kecuali mode kompatibilitas. Lihat stackoverflow.com/questions/3345397
bug
Clojure tidak memiliki makro yang higienis, seperti yang saya alami dengan susah payah.
pyon
40

Jangan lupa tentang perbedaan Lisp-1 dan Lisp-2.

Skema dan Clojure adalah Lisp-1:
Itu berarti nama variabel dan fungsi berada di namespace yang sama.

Lisp yang umum adalah Lisp-2:
Fungsi dan variabel memiliki ruang nama yang berbeda (sebenarnya, CL memiliki banyak ruang nama).

paul
sumber
-4

Gimp ditulis dalam Skema :)

Bahkan membagikan perangkat lunak yang menurut beberapa orang mungkin ditulis dalam C ++ mungkin dilakukan di bawah payung Lisp, sulit untuk memilih apel emas dari kelompok itu. Faktanya adalah C ++ tidak selalu populer, sepertinya hanya populer hari ini karena sejarah pembaruan. Selama setengah abad yang lebih rendah, C ++ bahkan tidak menggunakan multithreading, di situlah Python saat ini menjadi wadah limbah kode lem buggy yang tidak teruji. Lebih cepat sedikit dan sekarang kita melihat peningkatan dalam pemrograman fungsional, lebih seperti beradaptasi atau mati. Saya pikir Java sudah benar sejauh menyangkut bagian adapt.

Skema dirancang untuk menyederhanakan bahasa Lisp, itulah satu-satunya tujuan kecuali tidak pernah benar-benar dipahami. Saya pikir Clojure melakukan hal serupa yang dimaksudkan untuk menyederhanakan Skema untuk JVM tidak lebih. Ini seperti setiap bahasa JVM lainnya hanya untuk meningkatkan pengalaman pengguna, hanya untuk menyederhanakan penulisan boilerplate di tanah Jawa.

Meeple
sumber
2
"dimaksudkan untuk menyederhanakan Skema untuk JVM tidak lebih" "seperti setiap bahasa JVM lainnya" Ya, benar.
oskarkv
4
Gimp ditulis dalam C, dan mendukung Scheme, Python dan Perl sebagai bahasa scripting.
lbalazscs