Apakah LISP masih berguna di dunia saat ini? Versi mana yang paling banyak digunakan?


117

Saya mencoba untuk belajar bahasa pemrograman baru dalam interval waktu yang teratur. Baru-baru ini, saya telah membaca bagaimana Lisp dan dialek-dialeknya berada di ujung spektrum lengkap dari bahasa seperti C / C ++, yang membuat saya cukup penasaran untuk mengetahui lebih banyak tentangnya. Namun, ada dua hal yang tidak jelas bagi saya, dan saya mencari panduan untuk itu:

  1. Apakah LISP masih dipraktekkan / digunakan di dunia saat ini, atau apakah itu bahasa warisan seperti FORTRAN / COBOL? Maksud saya, selain mempertahankan kode yang ada, apakah itu digunakan pada proyek baru sama sekali?

  2. Apa dialek yang paling banyak digunakan? Saya menemukan Skema dan Common Lisp sebagai 2 dialek yang paling lazim, dan ingin pendapat Anda yang mana yang paling disukai / bermanfaat untuk dipelajari - dan akan sangat bersyukur jika Anda dapat menyarankan sumber daya apa pun untuk pemula yang berpangkat pemula.

Sementara ingin belajar bahasa yang secara fundamental berbeda dari bahasa prosedural yang biasa saya gunakan, saya tidak ingin menginvestasikan upaya yang tidak semestinya dalam sesuatu jika itu benar-benar usang - saya masih akan belajar jika bahasa itu secara profesional "mati", tetapi hanya dengan perspektif akademik ...


10
Saya sangat tertarik dengan pertanyaan ini. Sesekali ketika saya punya waktu, saya memutuskan untuk belajar Lisp. Dan setiap kali saya digagalkan oleh pertanyaan dan ketidakpastian yang sama dengan yang Anda tanyakan di sini. Versi Lisp mana yang harus saya pelajari? Apakah ada orang (selain Paul Graham) yang benar-benar menggunakan Lisp? Haruskah saya mempelajari Lisp, atau salah satu bahasa pemrograman fungsional yang lebih baru seperti Haskell? Apa manfaat Lisp daripada Skema, dll., Dll.
Channel72


Praktis Common Lisp: gigamonkeys.com/book
Joe Internet

"masih"? (Aku bercanda!)
jhocking

Saya baru saja menemukan ini, utas terkait lainnya di SO: stackoverflow.com/q/1614724/212942
TCSGrad

Jawaban:


59

Saya lebih suka Skema, jika Anda ingin bekerja dengan JVM Anda harus memeriksa Clojure, yang merupakan cadel yang dirancang untuk bekerja di JVM. Dan ya, Lisp masih layak dipelajari untuk melihat betapa dahsyatnya desain seminimal itu! Orang-orang yang menciptakan lisp mendapatkan beberapa hal yang benar. Sungguh menakjubkan betapa banyak fitur baru keren dari bahasa modern lisp di tahun 1960-an!

Untuk skema yang disematkan coba tipu daya: http://www.gnu.org/s/guile/


Apakah ada dialek yang berfungsi baik dengan C / C ++, karena saya terutama seorang pria C ++? Bisakah Anda juga menyebutkan beberapa sumber daya untuk pemula peringkat, untuk mulai belajar dialek itu?
TCSGrad

10
Skema buku terbaik untuk dipelajari adalah "The Little Schemer" dan "SICP" mitpress.mit.edu/sicp . Ada sejumlah implementasi skema yang dapat tertanam di dalam c / c ++, tapi saya tidak benar-benar tahu mana yang bagus hari ini sehingga Anda mungkin harus melakukan beberapa googling.
Zachary K

1
Saya harus tunjukkan bahwa skema itu sangat sederhana! Anda akan belajar sekitar 90% dari bahasa dalam 2 jam. Tentu saja itu tidak berarti Anda akan menguasainya, hanya saja Anda akan tahu bagaimana sintaks bekerja.
Zachary K

5
@ shan23 Scheme dirancang untuk pengajaran. Tanpa ragu dapat digunakan untuk mengajar mahasiswa baru cara memprogram jadi saya tidak ragu Anda tidak akan kesulitan mempelajarinya. Jika Anda menginginkan integrasi C atau C ++, lihat Guile ( en.wikipedia.org/wiki/GNU_Guile ).
Vitor Py

1
Buku bahasa pemrograman Skema Kent Dybvig mungkin tidak setenar itu, tetapi buku yang sangat bagus. schema.com/tspl4 Jika Anda menggunakan Emacs, maka mempelajari beberapa Lisp itu berguna.
blispr

68

Dalam menjawab pertanyaan 2, "Dialek yang paling banyak digunakan":

Tergantung pada bagaimana Anda menafsirkan "Paling banyak digunakan." Berikut adalah beberapa matematika serbet untuk batas bawah tentang berapa banyak menggunakan masing-masing dari beberapa dialek terpilih.

Sebagian besar kode mentah ditulis

  • Kemungkinan Skema (semua dialek) karena aplikasi pendidikan
    • 270 sekolah ... Mari kita tebak 50 siswa / tahun, 500 baris kode / siswa, 10 tahun berjalan. 1.000.000 garis berdasarkan matematika serbet.
    • 500.000 baris Racket in Racket sendiri dan alat-alatnya.
  • Mungkin Gangguan Umum karena AI dan banyak kode sumber terbuka dan kode produksi (Lihat kode produksi).
  • Mungkin Emacs Lisp karena ...
    • Emacs sendiri: lebih dari 1.000.000 baris
    • Jumlah emacs lisp yang ditulis untuk umum - 237 modul, sekitar 200 baris / modul hanya 40.000+ baris saja di EmacsWiki, mungkin jauh lebih banyak di ELPA
    • Plus aplikasi yang ditulis dalam emacs Lisp, file .emacs, dll.
  • Clojure
    • Sulit diperkirakan. Sebagian besar dotcom lebih kecil. Bisa jadi banyak.

Pemenang: Skema atau Common Lisp. Terlalu banyak yang tidak diketahui.

Sebagian besar kode 'produksi'

Pemenang: Saya menduga Common Lisp . Saya pikir kita bisa menjawab "Ya" untuk pertanyaan 1 berdasarkan penggunaan Common Lisp dan Clojure.

Sebagian besar pengguna akhir

  • Gangguan umum
    • Pelanggan Perangkat Lunak ITA, termasuk Orbitz, Bing Travel, dan Kayak.com - Mungkin jutaan.
  • Clojure
    • Citigroup (tanpa perincian), Akamai (tanpa perincian), simple.com, banyak lainnya. Mungkin jutaan.
  • Skema
    • Siswa, peneliti, dan penggemar hobi CS. Kurang dari satu miliar.
    • Seri Uncharted - Lebih dari 5 juta
  • Emacs Lisp - Sebagian besar programmer, sebagian besar pada platform unix. Bisa jadi sejuta.

Pemenang: Skema memiliki batas bawah terbaik di sini, karena ada nomor penjualan di Uncharted, tetapi cukup dapat diperdebatkan.

Kesimpulan

Kesimpulannya, saya menemukan apel besar itu.


4
Bukan jeruk kecil? Atau lemon purpreen?
Vatine

Memang skema - skema raket especailly - tampaknya menjadi dialek lump paling terbaru. Alat dan perpustakaan kelas profesional.
Bikal Lem

@Bikal Saya berharap dukungan OpenGL tidak begitu tua, tetapi kemudian mode langsung bukan kesalahan terbesar dari kode Racket saya ...
Jesse Millikan

Tidak tahu bahwa Orbitz menggunakan CL ... Saya tahu di mana mencari pekerjaan saya berikutnya: D
Rig

2
Banyak lebih dari 100rb LOC telah ditulis dalam Racket. Library / IDE / tools Racket standar lebih dari 500k, ditambah lagi digunakan di perusahaan seperti SET, Boeing, dan Naughty Dog.
Sam Tobin-Hochstadt

43

Apakah LISP masih dipraktekkan / digunakan di dunia saat ini, atau apakah itu bahasa warisan

Ya, memang, tetapi Anda harus tahu ke mana harus mencari. Orang-orang yang menggunakan LISP cenderung tidak berteriak terlalu keras tentang hal itu tetapi ada beberapa contoh dari beberapa startup profil tinggi yang menggunakannya untuk efek besar selama 20 tahun terakhir. Ini juga sangat populer di perusahaan kecil di Eropa.

Apa dialek yang paling banyak digunakan?

Ini adalah pertanyaan yang valid, tetapi tidak mudah dijawab. Mungkin juga bukan jawaban yang sangat berguna untuk dijawab: banyak implementasi yang memiliki fokus khusus sehingga lebih baik dipilih jika cocok dengan masalah khusus Anda daripada didasarkan pada seberapa luas ia digunakan. Sebagai gantinya, saya akan memberi tahu Anda sedikit tentang opsi Anda dan Anda dapat memutuskannya sendiri.

LISP adalah kumpulan bahasa dan masing-masing bahasa tersebut memiliki keluarga dialek dan implementasi. Secara luas dialek jatuh ke dalam dua kubu "LISP" dan "Skema".

LISP: Hingga relatif baru, LISP Umum adalah raja. Itu adalah upaya untuk menyatukan semua LISP yang berbeda dan, tanpa bersikap jahat, adalah "C ++" dari LISP. Dengan kata lain, itu adalah bahasa BESAR . Itu memiliki segalanya. Selama beberapa tahun terakhir, Clojure telah muncul. Clojure adalah LISP yang berjalan pada Java Virtual Machine dan mencoba untuk membasmi dirinya dalam filosofi pemrograman fungsional. Secara tradisional, LISP lain telah benar-benar multi-paradigma. Clojure menarik karena ia mendapatkan yang terbaik dan yang terburuk dari LISP dan JVM. Masih banyak bertele-tele dari bahasa berbasis Java dan mereka sudah cukup gratis dan mudah dengan sintaks sehingga memiliki banyak tombol-tombol dan tombol untuk hal-hal yang berbeda, tapi mereka punya beberapa benar-benaride-ide menarik di sekitar tipe data, terutama beberapa cara praktis yang mereka buat untuk menerapkan ide-ide dari pemrograman fungsional.

Skema: Skema adalah subset ketat dari LISP. Skema ditemukan oleh Steele dan Sussman dan pada awal kehidupannya terkenal karena digunakan dalam Kursus Kuliah Komputasi 101 MIT. Skema didefinisikan dalam "Laporan Revisi Skema Bahasa Algoritmik (RnRS)". Ya: mereka punya lelucon matematika di sana. Skema adalah bahasa yang distandarisasi dengan cara yang tidak dimiliki LISP lain. Ini sangat membantu dengan portabilitas di antara implementasi, tapi itu bukan peluru perak. Upaya standardisasi cenderung konservatif dan inovasi dalam implementasi, terutama seputar hal-hal seperti modul, cenderung berbeda. Ada juga serangkaian SRFI (Skema Permintaan Implementasi) yang mirip dengan proses RFC IETF. Orang menggunakannya untuk membakukan hal-hal kecil sesuai kebutuhan.

Skema berbeda dari LISP bahwa mereka memiliki seperangkat persyaratan keras yang harus mereka penuhi, salah satunya adalah "optimasi panggilan ekor" yang membantu membuat rekursi menjadi efisien. Oleh karena itu, gaya pemrograman rekursif jauh lebih populer di Skema daripada di LISP. Skema itu, juga tanpa menjadi tidak ramah, seperti "C" dari LISP. Dengan kata lain, ini adalah bahasa yang kecil dan Anda seharusnya bisa menyimpan semua itu di kepala Anda sekaligus.

Saat ini ada dua keluarga Skema: Yang didasarkan pada versi ke-5 (R5RS) dan yang berdasarkan pada versi ke-6 (R6RS). Kompleksitas R6RS jauh lebih besar daripada para pendahulunya dan begitu banyak implementasi R5RS telah memilih untuk melewatinya, berharap R7RS akan lebih mirip dengan R5RS daripada R6RS. Proses standardisasi R7RS saat ini sedang berlangsung dan telah mencoba untuk memasukkan baik keinginan pelaksana R5RS maupun orang-orang dari R6RS dengan membakukan bahasa dasar kecil dalam kelompok kerja pertama mereka dan kemudian menugaskan kelompok kerja kedua untuk menstandarisasi fitur yang lebih besar. Ini akan memungkinkan bahasa untuk memiliki implementasi yang efisien dan berguna pada kedua perangkat keras tertanam kecil serta mesin yang lebih mampu.

Sekarang saya akan lebih spesifik:

PicoLisp adalah LISP yang benar-benar keren. Itu kecil! Penulisnya menulis untuk dirinya sendiri dan, seperti yang saya mengerti, dia mencari nafkah sejak 1980-an. Jika Anda pernah mendapat kesempatan untuk menghadiri ceramah olehnya maka Anda harus melakukannya: dia benar-benar menarik dan benar-benar tahu barang-barangnya dan Anda bahkan tidak akan mendapatkan bau terkecil dari apa pun yang mainstream atau membosankan.

Saya tidak terbiasa dengan implementasi Common Lisp jadi saya tidak akan berkomentar lebih jauh tentangnya.

Tipu daya adalah Skema GNU resmi.

Racket adalah skema R6RS tetapi akhir-akhir ini kelihatannya telah memperluas jaringan dan mencoba "untuk melayani sebagai platform untuk penciptaan, desain, dan implementasi bahasa."

Ayam bertujuan untuk menjadi Skema praktis. Ini didasarkan pada R5RS dan dikompilasi ke C. Ini ternyata menjadi keuntungan yang sangat, sangat, penting karena membuatnya sangat sepele untuk menggunakan perpustakaan C yang ada. Oleh karena itu Chicken mungkin merupakan skema yang paling berguna untuk mengganti Perl, Python, Ruby, dll, sebagai bahasa skrip Anda sehari-hari. Ada beberapa orang yang telah menggunakannya secara eksklusif untuk semua kebutuhan mereka selama beberapa tahun. Ini memiliki REPL interaktif serta kompiler. Komunitas (baik di milis dan IRC) berpengetahuan luas, ramah dan membantu.

Cari implementasi dengan banyak modul: ini menunjukkan bahwa itu dapat digunakan secara luas dan berarti kemungkinan memiliki sesuatu yang membantu dengan tugas yang ada.

Cari implementasi dengan kompiler atau, paling tidak, sesuatu yang tidak sepenuhnya berbasis IDE atau REPL. Banyak implementasi yang dirancang untuk pengajaran sangat sulit digunakan untuk penulisan tujuan umum.

Saya akan merekomendasikan Chicken karena itulah yang saya gunakan. Saya telah menggunakannya dalam proyek pribadi saya dan saya telah menggunakannya (dan saat ini menggunakannya) secara profesional.

Saya tidak ingin menginvestasikan upaya yang tidak semestinya dalam sesuatu jika benar-benar usang - saya masih akan mempelajarinya jika itu secara profesional "mati", tetapi hanya dengan perspektif akademis ...

Skema tidak mati secara profesional, tetapi Anda mungkin harus berusaha keras untuk menggunakannya dalam konteks itu. Sesuatu seperti Chicken jauh lebih dari sekedar pengejaran akademis dan dapat dengan mudah mencakup hampir semua basis bahasa tingkat tinggi apa pun yang saat ini Anda gunakan.


3
Racket bukan Skema R6RS; ada satu di antara bahasa yang disediakan distribusi Racket. Bahasa Racket yang sebenarnya adalah Skema yang berangkat dari RnRS dalam sejumlah cara penting (tentang perasaan campur aduk saya).
JasonFruit

27

Tidak dapat benar-benar berbicara untuk semua Lisps tetapi Clojure jelas merupakan bahasa yang panas dan relevan saat ini. Kelompok Pengguna London Clojure yang saya datangi awal minggu ini memiliki lebih dari 100 peserta ....

Saya telah menemukan bahwa itu adalah pengalaman yang sangat mencerahkan untuk mempelajari Lisp dalam bentuk Clojure selama setahun terakhir (setelah banyak pengalaman dengan Java dan C #). Alasan utama untuk ini adalah:

  • Ini memiliki penekanan yang cukup kuat pada pemrograman fungsional (lebih daripada kebanyakan Lisps lainnya). Penulis dan BDFL Rich Hickey telah sering mengutip Haskell sebagai salah satu inspirasinya untuk desain bahasa yang berarti Anda mendapatkan hal-hal seperti struktur data yang sepenuhnya tidak berubah dan urutan tak terbatas yang malas, dll.
  • Metaprogramming makro - filosofi "kode adalah data" Lisp sulit untuk dipahami kecuali Anda benar-benar mengalaminya, tapi itu salah satu alasan mengapa Lisps begitu ekspresif dan produktif
  • Dukungan luar biasa untuk konkurensi multi-core - Saya sebenarnya berpikir Clojure adalah bahasa terbaik untuk pemrograman bersamaan saat ini. Lihat http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey untuk presentasi yang mencerahkan tentang ini

Ini juga tampaknya menjadi pilihan praktis untuk penggunaan produksi nyata karena alasan berikut:

  • Berjalan di JVM dengan interoperabilitas Java yang sangat mudah memberi Anda akses ke semua perpustakaan dan alat di ekosistem Java
  • Ini adalah bahasa yang dinamis secara default, yang membuatnya sangat nyaman untuk pengembangan dan pembuatan prototipe cepat dengan hampir tidak ada boilerplate. Namun Anda dapat menambahkan petunjuk tipe statis untuk mendapatkan kinerja yang cukup bagus di mana Anda membutuhkannya.

Saya pribadi kenal orang yang menggunakan Clojure di beberapa bank investasi dan perusahaan pemula. Saya juga memilih Clojure sebagai bahasa pengembangan utama untuk startup saya sendiri, jadi saya bersedia untuk menaruh uang saya di tempat mulut saya :-)


9

Saat ini saya sedang belajar Lisp (dan saya menyukainya). Saya menggunakan Common Lisp tetapi saya juga telah bermain-main dengan SBCL , Arc (perhatikan, itu adalah Lisp versi Paul Graham, yang disebutkan oleh Vitor Braga yang menciptakan Yahoo store / Viaweb) dan Allegro CL yang mirip dengan Visual Studio for Lisp (bisa buat GUI, namun, saya tidak pernah menggunakannya).

Sedangkan untuk penggunaan, Lisp telah banyak digunakan dalam Kecerdasan Buatan tetapi saya akan jujur, saya tidak yakin berapa banyak kegunaan "umum" lainnya untuk Lisp. Banyak situs web yang dibangun dalam Lisp awalnya telah ditulis ulang dalam bahasa lain sehingga sulit untuk mengatakan bahwa itu digunakan dalam pengembangan web (tidak mengatakan tidak, tetapi situs yang lebih besar yang menggunakannya tidak lagi melakukan ). Setelah melakukan pencarian cepat (sangat cepat) di sini adalah daftar perangkat lunak yang ditulis dalam Common Lisp dari Wikipedia .

[EDIT] Mengenai penggunaan Lisp secara profesional, ada pekerjaan di luar sana yang mengharuskan Anda menggunakan Lisp. Mereka tidak sebanyak, katakanlah pekerjaan Java atau C #, tetapi mereka ada. Saya pikir Lisp adalah salah satu bahasa yang digunakan untuk aplikasi internal dan dapat memberikan keunggulan kompetitif yang perusahaan tidak ingin menyerah dengan iklan yang mereka gunakan Lisp. Saya ingat melihat posting di P.SE yang menyatakan Smalltalk serupa di arena keuangan.

Juga, bisa menunjukkan Anda dapat mempelajari berbagai paradigma dapat membuka lebih banyak pintu bahkan jika Anda tidak menggunakan Lisp dalam pekerjaan.

"Lisp layak dipelajari untuk pengalaman pencerahan mendalam yang akan Anda miliki ketika Anda akhirnya mendapatkannya; pengalaman itu akan membuat Anda menjadi programmer yang lebih baik untuk sisa hari-hari Anda, bahkan jika Anda tidak pernah benar-benar menggunakan Lisp sendiri." - Eric Raymond, "Cara Menjadi Peretas"

[/SUNTING]


7
FWIW, SBCL adalah implementasi Common Lisp dan begitu juga Allegro CL.
Vatine

@Vine - Anda akan benar. Jika ada wajah memerah aku akan membuatnya sekarang. Saya tidak tahu mengapa saya menganggap mereka berbeda. Bodoh aku kompiler berbeda! = Dialek berbeda :) Terima kasih!
Jetti

@ Jeff: Yah, mereka berdua memperluas bahasa ke arah yang berbeda, sambil meninggalkan "CL core" interoperable.
Vatine

@ Jetti Apa yang Anda gunakan di tempat pertama?
Mark C

Saya percaya saya menggunakan CLISP, itu pada gambar VM yang tidak lagi saya miliki. Saya pikir ketidaktahuan saya membuat saya percaya itu adalah masalah umum. Setidaknya sekarang saya tahu lebih baik.
Jetti

8

Jika Anda ingin belajar Lisp hari ini, saya akan melihat baik raket, yang merupakan implementasi skema cepat (well, itu sebenarnya berangkat sedikit dari skema, jadi itu adalah dialeknya sendiri sekarang) atau clojure, yang mendapat manfaat dari JVM beroperasi (jadi tersedia banyak perpustakaan, plus Anda dapat membuatnya berinteraksi dengan kode Java Anda sendiri).

Sekalipun Anda tidak mempelajarinya untuk benar-benar menggunakannya, mempelajarinya selalu bermanfaat: Anda mempelajari cara-cara baru untuk berpikir dan menangani masalah, bahkan dalam bahasa lain, begitu Anda memusatkan perhatian pada Lisp untuk sementara waktu.


3
Masalah dengan Skema adalah ketika Anda mulai berlatih dengannya, Anda tidak ingin kembali ke bahasa lain. Saya baru saja mulai mengimplementasikan stream (mungkin tak terbatas, malas dievaluasi, urutan tidak berubah) di C ++ dan itu jauh lebih banyak kode daripada di Skema! Saya benar-benar terkejut dengan kombinasi kesederhanaan dan kekuatan Skema.
Giorgio

++ untuk Racket. Ini benar-benar luar biasa, yang merupakan salah satu kritik dari skema lain. Dan itu melampaui apa yang dapat dilakukan skema dalam hal menciptakan bahasa Anda sendiri.
Scott Klarenbach

7

Sebagian besar backend Amazon dulu berada di Lisp tetapi sekarang ditulis ulang dalam C ++, atau begitulah yang saya dengar (saya harus mengakui bahwa saya tidak memiliki sumber yang dapat diandalkan untuk ini).

Yahoo! Toko adalah salah satu contoh klasik dari aplikasi web Lisp. Dari Yahoo! Ketenaran toko yang mungkin pernah Anda dengar tentang Paul Graham . Graham adalah salah satu advokat Lisp terkenal dan menulis banyak tentang hal ini. Anda mungkin ingin membaca situsnya untuk mengetahui poinnya.

AutoCAD dulu memiliki dialek Lisp untuk sistem makro itu. Saya tidak tahu apakah masih ada.

Skema adalah bahasa yang bersih dan sangat elegan. Mungkin bahasa pemrograman favorit saya jadi saya mungkin bias. Jika saya akan menulis sekarang aplikasi utama saya mungkin akan menulis aplikasi kerangka dalam C, memperluas dan menetapkan aturan bisnis dalam Skema. Ini memungkinkan saya menggunakan Skema dan memanfaatkan C - untuk kecepatan dan ketersediaan perpustakaan untuk hampir semuanya.


Apa yang akan Anda rekomendasikan sebagai buku awal / kompiler untuk Skema? Saya menggunakan Linux, jadi jika ada editor yang secara eksplisit berguna untuk pemula, (seperti Kile untuk LaTex), beri tahu saya ...
TCSGrad

1
@ shan23 The Little Schemer ( ccs.neu.edu/home/matthias/BTLS ) adalah taruhan terbaik Anda. Saya percaya emacs adalah editor paling umum untuk Skema tetapi butuh beberapa saat untuk membiasakan diri dengannya.
Vitor Py

1
Editor untuk lisp, itu mudah, gunakan emacs. Itu ditulis oleh lisp guys, dan dalam lisp.
Zachary K

Anda juga dapat menggunakan IDE Racket ( racket-lang.org ); itu seperti Emacs tetapi memiliki pemformatan otomatis dan interaksi dengan juru bahasa Skema.
Jeremiah Willcock

Lispbox ( common-lisp.net/project/lispbox ) bekerja di luar kotak (beberapa pengalaman emacs berguna). Ini didasarkan pada ccl ( ccl.clozure.com ), lihat juga gigamonkeys.com/book/…
Giorgio

4

Apakah LISP masih dipraktekkan / digunakan di dunia saat ini, atau apakah itu bahasa warisan seperti FORTRAN / COBOL? Maksud saya, selain mempertahankan kode yang ada, apakah itu digunakan pada proyek baru sama sekali?

Saya kenal beberapa orang yang melakukan Lisps di beberapa startup di Silicon Valley, dan saya tahu bahwa Amazon.com telah menggunakan Lisp sejak awal (meskipun saya dengar mereka menggantinya dengan C ++ karena suatu alasan?)

Tapi satu perusahaan yang harus diperhatikan adalah Anjing Nakal . Semua game mereka ditulis dengan dialek Lisp. Awalnya, mereka menggulung sendiri, tetapi mereka menggunakan MZScheme dalam seri Uncharted.

Apa dialek yang paling banyak digunakan? Saya menemukan Skema dan Common Lisp sebagai 2 dialek yang paling lazim, dan ingin pendapat Anda yang mana yang paling disukai / bermanfaat untuk dipelajari - dan akan sangat bersyukur jika Anda dapat menyarankan sumber daya apa pun untuk pemula yang berpangkat pemula.

Saya bertaruh bahwa Common Lisp, Clojure, Scheme, dan Emacs Lisp adalah empat dialek yang paling banyak digunakan, dan dari semua itu, saya curiga bahwa Scheme adalah yang paling umum digunakan. Saya tidak punya apa-apa untuk mendukung ini, tentu saja. :)

Saya lebih suka SICP dan Little Schemer, seperti yang disarankan oleh orang lain, tetapi saya juga menyarankan Land of Lisp , yang merupakan bacaan yang agak menghibur. :)


Memang, Tanah Lisp adalah bacaan yang menakjubkan.
Chiron

@ 4bu3li Yu no upvote?
Mark C

1
Tentang Naughty Dog: Itu tidak sepenuhnya benar, game PS2 mereka ditulis dalam GOAL, bahasa mirip-lisp ... Tetapi sejak pindah ke PS3, mereka telah beralih menggunakan C ++. MZScheme sebagian besar digunakan sebagai preprocessor makro, ditulis sejalan dengan C ++, dan digunakan untuk beberapa pemrosesan aset, dan beberapa skrip mereka ditulis dalam S-exps. Tetapi tidak ada kode MZScheme yang benar-benar berjalan di PS3.
Arelius

2

Saya pikir itu sebagian tergantung pada apa yang ingin Anda lakukan dengan itu - jika Anda melihat memajukan wawasan Anda ke berbagai konsep pemrograman dan menjadikan diri Anda seorang programmer yang lebih baik maka saya akan mengatakan itu layak belajar setidaknya sejumlah kecil Lisp. Jika Anda mencari bahasa lain untuk ditambahkan ke resume Anda dengan maksud untuk mendapatkan pekerjaan yang bekerja dengan bahasa ini, Anda mungkin ingin mencari di tempat lain. Tidak ada banyak pekerjaan Lisp di luar sana.

Saya pribadi mencoba menggunakan SBCL atau yang lebih baru, Clojure (dan beberapa Emacs Lisp, tapi htat karena saya pengguna Emacs jangka panjang - saya akan mencoba mempelajari Emacs Lisp ketika saya mencoba belajar Lisp). Sekarang yang perlu saya lakukan adalah menemukan waktu untuk benar-benar bermain dengan bahasa-bahasa itu ...


1
Sebagian besar yang pertama ... sebagai bukti yang cukup bahwa jika saya berhasil dalam hal itu, tentu tidak akan melukai resume saya sama sekali :). Tapi sungguh, saya ingin perspektif tentang "gaya" pemrograman yang berbeda, sehingga saya memiliki ide yang baik untuk digunakan dalam skenario yang berbeda (Tidak ingin jatuh ke dalam situasi yang hanya dilengkapi palu, Saya harus memperlakukan semua masalah sebagai kuku !!)
TCSGrad

2

Saya tidak tahu bahwa ada banyak pekerjaan di LISP, saya pasti tidak bisa melihatnya. Tapi saya ingat waktu yang lama membaca tentang beberapa penyelidikan NASA di mana mereka menjalankan LISP dan mampu memasukkan kode baru dari bumi.

Juga di New York grup pertemuan clojure sangat besar. Saya menduga bahwa jika Anda tertarik dan pergi ke grup meetup clojure Anda, Anda mungkin menemukan peluang untuk jaringan dan mencari pekerjaan (bukan pekerjaan clojure tetapi hal-hal seperti Java / C ++ / etc.). Tampaknya sangat besar di daerah New York, daerah lain mungkin berbeda.

LISP juga merupakan cara berpikir yang berbeda. Selain itu LISP dan SQL keduanya menghasilkan banyak ekspresi bersarang. Saya menggunakan SQL satu ton dan kemudian melihat LISP lebih masuk akal. Tetapi jika Anda memiliki masalah dengan SQL yang digunakan untuk tanda kurung dan ekspresi super saat menggunakan LISP mungkin akan membuat ekspresi SQL lebih mudah untuk diketahui.

Contoh klasik adalah bagaimana menerapkan MAX (a, b, c). Anda bisa membuat fungsi berbelit-belit dengan banyak pernyataan if. Atau bisa dibilang begitu

MAX (MAX (a, b), c)

dan gunakan dua panggilan bersarang sederhana dari dua item MAX, yang bagi saya lebih mudah dibaca. Meskipun jika kinerja adalah masalah Anda mungkin ingin melakukannya dengan cara lain juga, saya tidak repot-repot menghitung jumlah perbandingan saat menggunakan setiap metode ... Juga jika Anda menerapkan MAX melalui makro C atau metode lain yang mengevaluasi ekspresi beberapa kali Anda mungkin tidak mendapatkan hasil yang diharapkan karena ekspresi dapat dievaluasi beberapa kali jadi waspadalah dengan efek samping ...


3
Anda benar-benar dapat menyederhanakan MAX denganMAX(MAX(a b) c)
Andrea

Anda benar, itulah yang saya dapatkan untuk menjawab sesaat setelah bangun tidur. Saya menyesuaikan jawabannya.
Cervo

2
Proyek NASA adalah Deep Space 1: flownet.com/gat/jpl-lisp.html
Frank Shearar

2

Dua poin tambahan:

Pertama, Lisp adalah bahasa yang bagus untuk menulis kode di mana interaksi antara fungsi atau data seringkali kompleks. Dalam banyak bahasa populer, jika Anda bingung tentang mengapa program Anda melakukan apa yang dilakukannya, Anda harus menulis fungsi khusus untuk membiarkan Anda memeriksa keadaan internal program saat berjalan. Dalam beberapa bahasa, Anda harus menunggu kode Anda dikompilasi ulang. Tentu saja mungkin ada alat seperti pengadu yang membantu dengan ini. Namun, di Lisp, yang Anda butuhkan hanyalah cara untuk menghentikan program, dan kemudian, biasanya, Anda memiliki akses ke semua yang ada di Lisp. Di Common Lisp, kadang-kadang saya cukup mengetikkan ^ C, atau menelponerrormenjadi satu fungsi (yang merupakan satu-satunya hal yang harus dikompilasi ulang, dan Anda tidak perlu melakukan apa pun untuk mengkompilasi ulang). Setelah saya menghentikan program, saya langsung dilemparkan ke debugger - tetapi debugger memberi saya semua kekuatan Lisp, dan saya dapat keluar dari debugger, memanggil fungsi-fungsi tertentu, dll. Saya dapat dengan mudah memeriksa salah satu struktur data dalam program saya. Sebagian besar Skema harus memungkinkan praktik serupa. Lisp tidak unik dalam hal ini, tetapi apa yang ditawarkannya melampaui apa yang ditawarkan banyak bahasa populer.

Kedua: Jika Anda akan bereksperimen dengan dialek Lisp, saya tidak akan melakukannya tanpa (a) menggunakan editor yang cocok dengan tanda kurung, dan (b) mempelajari lekukan Lisp yang tepat. Sebaiknya gunakan editor yang akan memperkirakan lekukan yang tepat untuk Anda juga. Pemformatan kode gaya C / C ++ / Java dirancang untuk bahasa dengan kurung / kurung / kurung lebih sedikit daripada Lisp. Gaya mencetak yang cantik sangat bagus setelah Anda terbiasa dengannya, dan Anda tidak akan bingung dengan tanda kurung atau menghabiskan setengah dari ruang Anda dengan menempatkan satu tanda kurung tutup per baris.


1

Saat ini saya mendapat kesan bahwa Lisp sebagian besar digunakan di toko-toko konsultasi (bukan toko konsultasi yang paling sering menggunakannya).

Itu dianggap outre sedikit untuk perangkat lunak praktis. Sebagian besar karena orang tidak terbiasa dengan itu, saya percaya.

Secara tradisional, Skema adalah dialek Lisp yang akademis, dan Common Lisp adalah dialek industri.

Lisp sangat berguna untuk manipulasi simbolik dan kemampuan refleksi-esque.

Sebagai contoh, kode yang saya tulis untuk belajar Lisp adalah sebuah program yang membangun fungsi lambda acak, mengevaluasinya, dan kemudian mengoperasikannya, dalam upaya untuk meminimalkan perbedaan fungsi dengan fungsi target. Semua itu adalah manipulasi langsung. Dalam bahasa seperti C ++ atau Java, saya harus menciptakan representasi untuk fungsi yang akan dimanipulasi komputer.


Poin menarik yang Anda buat tentang perbedaan antara Skema / Common Lisp - dapatkah Anda menguraikan tentang mengapa / bagaimana?
TCSGrad


1

Saya ingin menambahkan beberapa perspektif tentang Common Lisp and Scheme. Saya telah menghindari clojure karena JVM, jadi saya tidak memiliki banyak perspektif tentang itu.

Skema adalah bahasa yang ringkas dan indah. Butuh banyak keputusan yang harus diambil CL karena warisan, dan mengambil pendekatan yang lebih murni. Misalnya, variabel dan fungsi berada di namespace yang sama. Bahasa default lebih kecil dan lebih ringkas, yang bekerja dengan baik untuk mengajari Anda hal-hal yang baik tentang cisp, misalnya itu menekan penggunaan rekursi alih-alih iterasi, karena secara default tidak memiliki loop berulang, dan membutuhkan pengoptimalan panggilan ekor . Skema memiliki sistem makro higienis yang sangat menarik, yang ada banyak nilai untuk belajar. Tapi IMO, saya akan merekomendasikan untuk belajar macro-style Unhygienic macro terlebih dahulu, yang sebagian besar dialek skema (?) Menawarkan setidaknya satu implementasi, bahkan jika itu bukan bagian dari spesifikasi. Karena tampaknya Anda sangat ingin belajar bahasa demi belajar, saya

Karena itu, komunitas Skema terpecah-pecah, dan selain dari beberapa kantong kecil, tampaknya sebagian besar didedikasikan untuk penelitian daripada menyelesaikan pekerjaan nyata ... Misalnya setiap dialek memiliki manajer paket mereka sendiri, dan paket yang paling sering tidak portabel. lintas dialek, yang merupakan masalah besar dalam komunitas skema.

Lisp umum di sisi lain, tampaknya menjadi pendekatan yang lebih pragmatis untuk mengembangkan bahasa. Standarnya sedemikian rupa sehingga banyak kode lisp yang portabel di antara implementasi, banyak kompiler yang cepat dan dioptimalkan dengan baik. Ada satu set paket besar, banyak di antaranya portabel di antara implementasi. Dan tampaknya sejumlah besar produk nyata sedang dibuat dalam bahasa tersebut. Dan dengan quicklisp, manajemen paketnya terasa cukup dekat dengan apa yang akan Anda dapatkan di komunitas modern seperti katakanlah Ruby, atau Node. CL, namun bukan tanpa cacat, ia memiliki spesifikasi yang sangat besar pada titik ini dibandingkan dengan skema, dan bahkan itu sistem objek CLOS, sesuatu yang secara tradisional ditulis sebagai perpustakaan di Lisps, adalah bagian dari spesifikasi IIRC. Dan Anda bisa merasakan warisan tertanam melalui sejumlah besar sistem.

Kalau tidak, saya katakan saya tidak bisa berbicara di clojure, dan Emacs Lisp jelas merupakan pilihan yang tepat jika tujuan Anda adalah menulis ekstensi Emacs, dan jelas bukan pilihan yang sesuai untuk perangkat lunak lain.

TLDR; Jika tujuan Anda adalah untuk belajar, saya merekomendasikan Skema. Namun, jika Anda ingin membuat perangkat lunak, saya akan merekomendasikan Common Lisp dari dua varian cadel utama.


BTW, PLT Racket adalah bahasa yang lebih mirip skema, dan berasal dari komunitas skema yang sepertinya berusaha berguna untuk pekerjaan nyata. Jika saya menulis kode dalam skema hari ini, kemungkinan besar itu PLT, atau Skema Ayam, tetapi nanti mungkin karena titik lemah di hati saya.
Arelius

0

Saya belajar banyak dari jawaban. Terima kasih untuk semua yang berkontribusi dalam percakapan yang mencerahkan ini.

Saya harus menyebutkan LISP baru . Meskipun sedikit berbeda dari CL dan Skema, ini mengimplementasikan banyak fungsi yang sangat berguna. Saya menemukan server http, fungsi multi-pemrosesan (Cilk) dan fungsi evaluasi jarak jauh sangat bersih dan mudah digunakan.

Eksekusi tunggal kecil, cepat dan termasuk banyak baterai keren.


Mungkin adil untuk menyebutkannya tetapi saya tidak akan merekomendasikannya ... Tidak ada pelingkupan leksikal dan tidak ada modul misalnya - serius? Saya tidak benar-benar mendapatkan apa yang ingin dicapai oleh newLISP.
cji

2
Anda benar - itu berbeda. Ini menggunakan konteks dan pelingkupan dinamis dan dari modul pengalaman saya dan konteks saling terkait. Itu tidak mencoba menjadi CL lain atau Skema. Membaca halaman tentang perbedaannya ( newlisp.org/index.cgi?page=Differences_to_Other_LISPs ) menyoroti masalah desain. Demikian juga, saya tidak akan merekomendasikan siapa pun yang menginginkan pengalaman CL atau Skema. Tetapi untuk beberapa kasus penggunaan bisa menjadi pilihan yang layak. Itulah keindahan ekosistem open source - banyak pilihan!
CyberFonic

0

Faktor lain yang perlu dipertimbangkan dalam memilih dialek Lisp mana yang harus dipelajari adalah jumlah dan kualitas implementasi. Jika dialek hanya memiliki satu atau dua implementasi, maka Anda terjebak dengan kekurangannya sampai kelemahan itu diperbaiki, dan selalu ada kemungkinan orang akan berhenti memperbaiki penerapannya. Dalam dirinya sendiri itu bukan alasan untuk tidak menggunakan dialek implementasi tunggal Lisp, tetapi itu sesuatu yang harus diperhitungkan. Keuntungan dari Skema dan Common Lisp adalah bahwa ada banyak implementasi dialek ini. Kedua bahasa telah menerbitkan standar, sehingga implementasi yang relatif baru cenderung menjalankan kode yang sama, sebagian besar. Beberapa implementasi ini sudah ada sejak lama, tetapi masih dalam pengembangan aktif: Mereka sekarang implementasi berkualitas tinggi, dan mereka masih disempurnakan.


Nah menurut tolok ukur yang Clojure lakukan tidak terlalu buruk dibandingkan dengan SBCL: benchmarksgame.alioth.debian.org/u32/…
AndreasScheinert

Terima kasih Andreas. Kamu benar. Menunjukkan seberapa banyak yang saya ketahui tentang JVM - tidak banyak. Pada bagian saya disesatkan oleh ABCL, CL berbasis JVM yang relatif lambat tapi bagus.
Mars

Saya berpendapat jika Anda ingin Lisp di JVM, pilih Clojure. Ini tidak sempurna tetapi ini merupakan kesenangan nyata (IMHO)
AndreasScheinert
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.