Setelah beberapa bulan belajar tentang dan bermain dengan Lisp, baik CL dan sedikit Clojure, saya masih belum melihat alasan kuat untuk menulis apa pun di dalamnya daripada C #.
Saya benar-benar ingin beberapa alasan kuat, atau bagi seseorang untuk menunjukkan bahwa saya kehilangan sesuatu yang sangat besar .
Kekuatan Lisp (per penelitian saya):
- Notasi kompak dan ekspresif - Lebih dari sekadar C #, ya ... tapi saya juga bisa mengekspresikan ide-ide itu dalam C #.
- Dukungan implisit untuk pemrograman fungsional - C # dengan metode ekstensi LINQ:
- mapcar = .Pilih (lambda)
- mapcan = .Select (lambda) .Aregregate ((a, b) => a.Union (b))
- mobil / pertama = .Pertama ()
- cdr / rest = .Skip (1) .... dll.
- Lambda dan dukungan fungsi tingkat tinggi - C # memiliki ini, dan sintaksinya bisa dibilang lebih sederhana:
- "(lambda (x) (tubuh))" versus "x => (tubuh)"
- "# (" dengan "%", "% 1", "% 2" bagus di Clojure
- Metode pengiriman terpisah dari objek - C # memiliki ini melalui metode ekstensi
- Pengiriman multimethod - C # tidak memiliki ini secara asli, tapi saya bisa mengimplementasikannya sebagai pemanggilan fungsi dalam beberapa jam
- Code is Data (and Macros) - Mungkin saya belum "mendapatkan" makro, tapi saya belum melihat satu contoh pun di mana gagasan makro tidak dapat diimplementasikan sebagai fungsi; itu tidak mengubah "bahasa", tapi saya tidak yakin itu kekuatan
- DSL - Hanya dapat melakukannya melalui komposisi fungsi ... tetapi berfungsi
- Pemrograman "eksplorasi" yang tidak diketik - untuk struct / kelas, properti otomatis dan "objek" C # bekerja cukup baik, dan Anda dapat dengan mudah meningkat menjadi pengetikan yang lebih kuat saat Anda mengikuti
- Berjalan pada perangkat keras non-Windows - Ya, jadi? Di luar kampus, saya hanya kenal satu orang yang tidak menjalankan Windows di rumah, atau setidaknya VM Windows di * nix / Mac. (Sekali lagi, mungkin ini lebih penting daripada yang saya pikirkan dan saya baru saja dicuci otak ...)
- REPL untuk desain bottom-up - Ok, saya akui ini benar-benar bagus, dan saya melewatkannya di C #.
Hal yang saya lewatkan di Lisp (karena campuran C #, .NET, Visual Studio, Resharper):
- Ruang nama. Bahkan dengan metode statis, saya suka mengikat mereka ke "kelas" untuk mengkategorikan konteksnya (tampaknya Clojure memiliki ini, CL sepertinya tidak.)
- Dukungan kompilasi dan desain-waktu yang hebat
- sistem tipe memungkinkan saya untuk menentukan "kebenaran" dari struktur data yang saya bagikan
- sesuatu yang salah eja digarisbawahi secara realtime; Saya tidak perlu menunggu sampai runtime tahu
- perbaikan kode (seperti menggunakan pendekatan FP bukan yang imperatif) disarankan secara otomatis
- Alat pengembangan GUI: WinForms dan WPF (saya tahu Clojure memiliki akses ke perpustakaan GUI Java, tetapi semuanya sepenuhnya asing bagi saya.)
- Alat Debugging GUI: breakpoints, step-in, step-over, pemeriksa nilai (teks, xml, custom), jam tangan, debug-by-thread, breakpoint bersyarat, jendela panggilan-tumpukan dengan kemampuan untuk melompat ke kode di tingkat mana pun di tumpukan
- (Agar adil, tugas saya dengan Emacs + Slime tampaknya memberikan sebagian dari ini, tapi saya tidak setuju dengan pendekatan yang digerakkan VS GUI)
Saya sangat suka hype di sekitar Lisp dan saya memberikannya kesempatan.
Tetapi adakah yang bisa saya lakukan di Lisp yang tidak bisa saya lakukan dengan baik di C #? Mungkin sedikit lebih verbose di C #, tapi saya juga punya autocomplete.
Apa yang saya lewatkan? Mengapa saya harus menggunakan Clojure / CL?
AND
atau OR
sebagai fungsi. Itu bisa dilakukan (diberikan LAMBDA
, yang juga makro) tapi saya tidak melihat cara yang jelas untuk melakukannya yang tidak akan benar-benar payah.