Apa yang hebat tentang Clojure? [Tutup]

40

Saya telah melihat Clojure belakangan ini dan saya menemukan posting ini di Stackoverflow yang mengindikasikan beberapa proyek mengikuti praktik terbaik, dan kode Clojure yang baik secara keseluruhan. Saya ingin memahami bahasa setelah membaca beberapa tutorial dasar sehingga saya melihat beberapa proyek "dunia nyata".

Setelah melihat ClojureScript dan Compojure (dua proyek "baik" yang disebutkan di atas), saya merasa Clojure hanya lelucon. Saya tidak mengerti mengapa seseorang akan memilih Clojure daripada mengatakan, Ruby atau Python, dua bahasa yang saya sukai dan memiliki sintaksis yang bersih dan sangat mudah untuk mengambil sedangkan Clojure menggunakan begitu banyak tanda kurung dan simbol di mana-mana sehingga merusak pembacaan untuk saya.

Saya pikir Ruby dan Python itu indah, mudah dibaca, dan elegan. Mereka mudah dibaca bahkan untuk seseorang yang tidak tahu bahasa luar dalam. Namun, Clojure adalah buram bagi saya dan saya merasa seperti saya harus tahu setiap detail kecil tentang implementasi bahasa agar dapat memahami kode apa pun.

Jadi tolong, beri tahu saya!

  • Apa yang baik tentang Clojure?
  • Apa minimum absolut yang harus saya ketahui tentang bahasa untuk menghargainya?
marco-fiset
sumber
14
I don't understand why someone would pick Clojure over say, Ruby or Python- Ini berjalan di jvm dan dapat menggunakan seluruh perpustakaan java. ... have such a clean syntaxbisa dibilang, bahasa fungsional seperti cisp memiliki sintaks dan struktur yang sangat bersih, itu hanya satu kebanyakan orang tidak terbiasa.
22
Namanya seksi.
programmer
4
Setiap remaja yang tinggal di ruang bawah tanah dapat mengambil Python dan Ruby dalam hitungan beberapa bulan. Jika hanya itu yang ingin mereka gunakan, maka mereka tidak akan pernah keluar dari ruang bawah tanah. Saya tidak mengatakan bahwa seseorang yang telah melakukan pengembangan Python profesional selama bertahun-tahun adalah manusia yang lebih rendah dibandingkan dengan seseorang yang menulis embedded C, tetapi jika Python dan Ruby adalah yang mereka tahu dan yang ingin mereka ketahui, maka ada sesuatu yang mencurigakan. Ngomong-ngomong, butuh saya secara pribadi lebih dari 6 tahun setelah lulus untuk menemukan dan menghargai pemrograman fungsional dan Lisps. Reaksi pertama saya terhadap Skema adalah sentakan.
Ayub
4
"bisa dibilang, bahasa fungsional seperti cisp memiliki sintaks dan struktur yang sangat bersih, itu hanya satu yang kebanyakan orang tidak terbiasa.": Saya memiliki sedikit pengalaman dengan Lisp dan saya baru saja mulai membaca buku "Praktis Common Lisp". Sejauh ini, saya belum menemukan masalah dengan sintaksisnya; IMHO mitos tentang sintaks seperti Lisp menjadi kurang dapat dibaca hanya FUD.
Giorgio
4
Saya mulai melihat Clojure baru-baru ini (tapi saya memiliki pengalaman sebelumnya dengan Haskell dan Scala, jadi sintaksnya tidak terlalu mengejutkan). Saya benar-benar merasa itu bisa dibaca. Ada sangat fewsimbol di luar kurung dibandingkan dengan banyak bahasa, dan hampir tidak ada kata-kata yang dipesan. Alasan Anda menemukannya tidak dapat dibaca adalah karena itu adalah paradigma yang benar-benar baru dan bekerja dengan cara yang berbeda secara fundamental dari bahasa Object Oriented. Berikan waktu dan kekuatan untuk melewatinya.
KChaloux

Jawaban:

47

Untuk latar belakang yang Anda berikan, jika saya dapat parafrase:

  1. Anda terbiasa dengan Ruby / Python.
  2. Anda belum melihat keuntungan dari Clojure.
  3. Anda tidak menemukan sintaks Lisp atau Clojure jelas.

... Saya pikir jawaban terbaik adalah membaca buku Programming Clojure oleh Emerick, Carper dan Grand. Buku ini memiliki banyak perbandingan kode eksplisit dengan Python, Ruby, dan Java, dan memiliki penjelasan teks yang membahas coders dari bahasa-bahasa tersebut. Secara pribadi, saya datang ke Clojure setelah membangun proyek-proyek berukuran besar dengan Python, dan memiliki beberapa pengalaman Lisp; membaca buku itu membantu meyakinkan saya untuk mulai menggunakan Clojure tidak hanya dalam proyek sampingan tetapi untuk tujuan profesional.

Untuk menjawab dua pertanyaan Anda secara langsung:

  1. Apa bagusnya Clojure? Banyak jawaban di situs ini dan di tempat lain, mis. Lihat https://www.quora.com/Why-would-someone-learn-Clojure
  2. Apa minimum absolut yang harus saya ketahui tentang bahasa untuk menghargainya? Saya sarankan untuk mengetahui ide-ide besar di balik desain Clojure, seperti yang diartikulasikan dalam Clojure Programming dan The Joy of Clojure secara bijaksana, dan dalam pembicaraan Rich Hickey, esp. Pembicaraan Simple Made Easy . Setelah Anda tahu apa / mengapa Anda kemudian dapat mulai memahami bagaimana saat membaca kode Clojure, esp. bagaimana mengubah pemikiran Anda dari kelas, objek, status / mutasi ke "hanya fungsi dan data" (fungsi tingkat tinggi, peta / set / urutan, jenis).

Saran tambahan: keanggunan dan kekuatan Lisp sebagian dari sintaksisnya yang minimalis dan sangat konsisten. Jauh lebih mudah untuk menghargai itu dengan editor yang baik, misalnya Emacs dengan mode-clojure dan ParEdit. Ketika Anda semakin terbiasa dengan itu, sintaks memudar dan Anda akan "melihat" semantik, niat, dan abstraksi singkat. Kedua, jangan mulai dengan membaca sumber untuk ClojureScript atau Compojure, itu terlalu banyak; coba beberapa masalah 4clojure.org, dan bandingkan solusi dengan coders teratas di sana. Jika Anda melihat 4-6 solusi lain, selalu seseorang akan menulis solusi FP-style yang benar-benar idiomatis, ringkas yang dapat Anda bandingkan dengan solusi gaya imperatif yang canggung, bertele-tele, dan rumit.

limist
sumber
20

Lisp dialek memiliki niche unik karena sintaksisnya yang sederhana. Sintaks sederhana ini membuat pemrograman meta melalui penggunaan makro sangat sederhana. Ini memungkinkan Anda untuk memodelkan bahasa yang sesuai dengan domain masalah Anda alih-alih pemodelan agar sesuai dengan domain masalah Anda ke dalam bahasa Anda. Ini benar-benar keren setelah Anda memahaminya, dan memungkinkan Anda melakukan banyak hal dengan mudah yang sangat sulit dalam bahasa lain.

The downside, adalah bahwa karena setiap program Lisp pada dasarnya mendefinisikan bahasanya sendiri, Anda benar-benar membutuhkan pemahaman yang kuat pada hal-hal untuk memahami apa yang sedang terjadi.

Sekarang, untuk menjawab pertanyaan Anda ...

  1. Clojure adalah dialek Lisp modern yang beroperasi di JVM / CLR. Ini membuatnya mudah untuk mengambil keuntungan dari kekuatan Lisp dalam infrastruktur yang ada.

  2. Sangat penting untuk memahami bagaimana menggunakan makro untuk membangun Lisp ke domain masalah Anda untuk menghargai penggunaannya. Saya benar-benar hanya mengerti ini setelah mengimplementasikan runtime Lisp, ketika saya menemukan bahwa banyak fitur bahasa inti dapat dengan mudah diimplementasikan dalam Lisp itu sendiri. Dibutuhkan proyek berukuran adil untuk mendapatkan ini.

Selain itu, meskipun menyenangkan untuk diprogram, saya pribadi tidak memiliki banyak kasus di mana saya akan beralih ke masalah sehari-hari. Ini adalah alat yang sangat bagus untuk belajar ekspansi pikiran, dan setelah mempelajari Lisp dengan benar, menjadi lebih alami untuk memanfaatkan fasilitas pemrograman meta dalam bahasa lain.

Sintaks sederhana membuatnya mudah bagi komputer untuk mengartikannya (memungkinkan makro yang kuat dan mudah), tetapi membuatnya sangat sulit bagi manusia untuk mengurai ekspresi kompleks dengan cepat.

bunglestink
sumber
2
Sudahkah Anda melihat lampu meja ?
4
Jawaban Anda membuatnya terdengar seperti makro adalah cara normal untuk mendekati pemrograman Lisp, padahal sebenarnya sebagian besar masalah pemrograman dapat diselesaikan dengan fungsi kelas satu yang biasa. Makro dimaksudkan terutama untuk digunakan untuk pemrograman bahasa (yaitu memperluas bahasa). Lihat juga bookshelf.jp/texi/onlisp/onlisp_9.html
Robert Harvey
3
@RobertHarvey Saya berpendapat bahwa jika Anda tidak mengambil keuntungan dari marcos, maka ada sejumlah besar bahasa lain yang saya akan beralih ke yang menawarkan fungsi kelas satu dengan sintaks yang lebih mudah dibaca.
bunglestink
@MichaelT yang terlihat rapi. Saya suka konsepnya.
DPM
3
@RobertHarvey Scala, JavaScript, C #, Python, dan Haskell semuanya ada di atas kepala saya sejauh bahasa dengan fungsi kelas satu yang saya anggap lebih sintaksis yang dapat diuraikan oleh manusia daripada Lisps.
bunglestink
10

Kekuatan Clojure telah disorot berkali-kali, dan, tentu saja, membuat bahasa yang sangat kuat, jadi saya tidak akan mengulanginya lagi di sini.

Saya selalu mencintai cisp, sejak masa lalu dan saya sangat senang ketika saya menemukan Clojure (mungkin kesempatan menggunakan cisp di luar akademisi akhirnya!). Namun ketika saya mulai belajar perasaan gelisah telah mulai merayap masuk, meskipun saya tidak dapat menentukan dengan tepat apa yang tidak saya sukai. Pertama-tama saya akan mengatakan bahwa pengkodean dalam Common lisp mudah dan menyenangkan bagi saya tetapi Clojure memiliki kurva belajar yang lebih curam. Clisp memiliki keindahan dan keanggunan tertentu. Saya tidak yakin saya akan mendapatkan perasaan yang sama dari Clojure. Saya bertanya-tanya apakah perasaan itu akan hilang ketika saya mendapatkan lebih banyak pengalaman.

Saya punya tebakan lain untuk sedikit penolakan misterius saya. Saya pikir itu mungkin fleksibilitasnya. Misalnya Anda dapat memiliki struktur setengah vektor dan setengah peta dan dengan beberapa karakter kode Anda dapat menerimanya sebagai parameter, pisahkan dan proses dengan benar. Ya, itu menghapus semua boilerplate, tetapi entah bagaimana rasanya tidak benar. Seolah-olah Anda tidak pernah tahu betul aturan di bawah semua tanda kurung, titik dua, tanda kurung, dll yang beroperasi.

Bagi saya, saya masih suka bahasa untuk semua kelebihannya (terutama, berjalan di JVM dan menyederhanakan konkurensi, sementara jauh lebih kuat, dan ringkas daripada Jawa dan dengan cacat desain yang kurang jelas), tetapi juri masih tidak yakin apakah sesuatu bisa ditingkatkan.

DPM
sumber