Apakah Lisp masih memiliki fitur khusus yang TIDAK diadopsi oleh bahasa pemrograman lain?
Dengan Lisp, maksud saya semua bahasa pemrograman Lisp secara keseluruhan. Saya telah diberitahu betapa menakjubkannya Lisp dan tahu bahwa banyak bahasa telah terinspirasi oleh Lisp. Tetapi apakah Lisp masih memiliki fitur desain eksklusif yang tidak dapat dilakukan dalam bahasa lain?
Alasan saya mengajukan pertanyaan adalah bahwa baru-baru ini, sebagai programmer amatir, saya mulai belajar Clojure hanya untuk bersenang-senang, dan hasilnya adalah saya menemukan banyak posting dan komentar terkait Lisp, hanya mengatakan satu hal: "Lisp unik ", tetapi bahasa pemrograman modern lainnya telah mengadopsi dan mencuri banyak ide dari Lisp, seperti persyaratan, rekursi, dan fungsi sebagai warga negara kelas satu. Dan bahkan metaprogramming dapat dilakukan oleh banyak bahasa.
Apakah saya kehilangan sesuatu dan apakah "Lisp masih berbeda"?
Atau saya beruntung karena bahasa modern lain telah mencuri semua bagian yang bagus dari Lisp sehingga tidak perlu menggali ke dalam kurung dunia Lisp , dan "Lisp berbeda".
Jawaban:
Referensi kanonik untuk jenis pertanyaan ini adalah Apa yang Membuat Lisp Paul Graham Berbeda . Dua fitur utama yang tersisa dari Lisp yang tidak tersedia secara luas, menurut artikel ini pada saat penulisan, adalah:
Komentar membahas setiap titik dan nama bahasa populer di mana fitur itu tersedia.
Perhatikan bahwa artikel ini terakhir kali direvisi pada tahun 2002, dan dalam 11 tahun terakhir telah ada berbagai bahasa baru, beberapa di antaranya dapat menggabungkan semua fitur Lisp ini ke dalam desain mereka.
sumber
eval
atau serupa, dan beberapa dapat melakukan metaprogramming, misalnya Haskell's Template Haskell. Hal unik (yang bisa dibilang) tentang Lisp adalah bahwa representasi untuk data, kode, dan meta-kode sama - tidak hanya dalam sintaksis, tetapi sebenarnya adalah hal yang sama.Pertanyaannya adalah yang sulit dijawab, karena seseorang harus mengetahui semua bahasa untuk mengetahui bahwa tidak ada yang lain yang memiliki fitur tertentu di Lisp, jadi yang berikut ini didasarkan pada bahasa yang saya alami.
Dari atas kepala saya, kondisi adalah sesuatu yang belum saya lihat dalam bahasa lain. Pikirkan 'pengecualian', tetapi di mana tumpukan panggilan tidak dibatalkan, dan di mana penelepon dapat mengirim nilai pemulihan ke situs pengecualian, tetapi tanpa mengganggu tumpukan panggilan di antara penangan dan sumber pengecualian. Agar adil, ini sebenarnya hanyalah aplikasi khusus kelanjutan, jadi Ruby dan Skema (setidaknya) dapat melakukan ini.
Sistem makro Lisp diuntungkan dari keteraturan / homoiklikositas, tetapi Scala berencana untuk memasukkannya sebagai fitur stabil di 2.12 dan Template Haskell mengklaim fitur serupa. Saya berpendapat bahwa mereka akan lebih kompleks secara sintaksis daripada dengan Lisp, tetapi pembuatan kode waktu kompilasi ada di sana.
Kalau dipikir-pikir itu, meskipun, membangun lurus bentuk hanya satu jenis makro yang tersedia di Lisp: Saya belum melihat setara dengan kompiler atau makro pembaca di tempat lain.
Kemampuan beberapa dialek (misalnya SBCL ) untuk menyimpan gambar proses yang lengkap dan dapat dilanjutkan kembali itu keren, tetapi sekali lagi itu tidak unik: Smalltalk telah melakukan itu selama beberapa dekade.
Banyak bahasa lain memungkinkan penetapan destruksi ketika mengembalikan array, tetapi pendekatan # 'values dan #' multiple-value-bind / let-values tampaknya masih spesifik untuk Common Lisp dan Skema (yang masih bisa melakukan destruksi 'reguler' juga ). 'Wantarray' Perl memungkinkan suatu fungsi untuk menentukan apakah itu dipanggil dalam konteks skalar, daftar, atau batal sehingga dapat menyesuaikan nilai kembalinya dengan cara yang mirip (-ish), tetapi saya belum melihat 'benar' beberapa nilai pengembalian di luar Skema / CL.
Dalam hal fitur bahasa, mungkin tidak banyak yang bisa dilakukan Lisp yang bahasa lain tidak bisa (Turing kelengkapannya seperti apa adanya). Apa itu adalah , bagaimanapun, adalah bahasa di mana kode tersebut dinyatakan dalam struktur data sendiri, membuat Big Idea ™ -yang kode data sesuatu yang relatif mudah untuk bekerja dengan.
sumber
Setelah begitu banyak dekade, saya tidak berpikir ada sesuatu yang eksklusif untuk Lisp. Tetapi bahkan hari ini, ada banyak hal menarik yang sulit ditemukan di luar Lisps. Beberapa hal yang terlintas dalam pikiran:
Akhirnya, ada banyak lagi yang bisa dipelajari dari Lisp yang bukan tentang bahasa itu sendiri tetapi menjadi bagian dari sejarah Lisp dan tersesat dalam waktu. Misalnya Interlisp, Genera Simbolik, dll ... jika Anda tidak pernah menggunakan Genera, lihat utas comp.lang.lisp ini di mana Kent Pitman menjelaskan bagaimana "Emacs hanyalah bayangan pucat dari Zmacs Genera" - yang semuanya diaktifkan oleh memiliki sistem Lisp yang kuat yang merupakan bagian dari Zmacs, yang dijalankan pada Mesin Lisp.
sumber
Itu belum tentu fitur tunggal . Seluruh tampilan dan nuansa, dan bagaimana set fitur tertentu bekerja bersama.
JavaScript atau Java memiliki banyak fitur Lisp (mesin virtual, kompiler / evaluator, pengumpulan sampah, dll.). Tetapi JavaScript misalnya tidak memiliki bagian pemrograman simbolis, tidak memiliki kemampuan matematika (secara internal ia hanya mengapung), tidak memiliki penanganan kesalahan, dan sebagainya.
Banyak sistem Common Lisp dioptimalkan untuk cara pengembangan di mana seseorang memperluas perangkat lunak baru secara bertahap, dengan memperluas bahasa Lisp dalam berbagai dimensi menggunakan berbagai teknik pemrograman meta - tanpa me-restart perangkat lunak untuk waktu yang lama. Karena itu ia harus fleksibel dan dapat diperpanjang - tetapi pada saat yang sama ia harus kuat. Mengubah bahasa (makro pada dasarnya adalah cara bagi pengguna untuk memperluas kompiler) tanpa membuat program macet.
Sekarang sesuatu seperti JavaScript juga digunakan untuk memperluas program, biasanya browser web. Tetapi sebagian besar waktu seseorang tidak banyak meta-pemrograman dalam JavaScript - selain beberapa peretasan OOP .
Contoh:
Seseorang dapat mengimplementasikan perangkat lunak matematika umum umum untuk domain aljabar komputer dalam dua cara: menulis mesin dalam bahasa C dengan bahasa khusus di atas (seperti Mathematica ) atau dalam beberapa dialek Lisp yang lebih maju. Macsyma / Maxima dalam Common Lisp, Reduce in Standard Lisp, Aksioma dalam Common Lisp.
(Ada juga satu atau lebih yang ditulis dengan Python.)
Tidak banyak sistem yang menawarkan serangkaian fitur seperti Axiom , yang berjalan di atas Common Lisp.
Apa yang membuat Lisp menarik untuk jenis aplikasi ini adalah campuran fitur: matematika dasar lanjutan (bignum, rasio, ...), perhitungan simbolik, kompiler interaktif, dll. Sangat mungkin untuk mendapatkan hal-hal ini dengan mengimplementasikannya dalam bahasa tingkat Dengan begitu, seseorang akan menerapkan 50% atau lebih dari sistem Lisp khas.
sumber
Tidak sejauh yang saya ketahui. Keempat dengan mudah sama dinamisnya dengan Lisp, mungkin lebih dari itu karena kode dinamis di Forth terlihat seperti kode Keempat biasa sedangkan makro Lisp cenderung menggunakan fitur yang berbeda dari kode Lisp biasa (di Clojure setidaknya saya belum pernah menggunakan kutipan sintaks di luar makro) dan akibatnya mereka terlihat sangat berbeda dari kode Lisp biasa. Sebagai contoh seberapa dinamis Forth, berikut adalah cara untuk mengimplementasikan komentar di Forth :
sumber
Lisp memiliki banyak dialek, dan masing-masing memiliki serangkaian fitur sendiri. Fitur favorit saya yang tidak mungkin diadopsi oleh bahasa lain adalah "tumpukan spaghetti" dari Interlisp .
Tumpukan spaghetti seperti penutupan, tetapi pada steroid. Ini tidak hanya menyimpan fungsi saat ini, tetapi seluruh konteks hingga bagian atas tumpukan. Sesuatu seperti co-rutin , kecuali bahwa Anda dapat membuatnya secara sewenang-wenang, menghasilkan hierarki konteks tumpukan.
sumber