Którego dialektu Lispa powinienem się nauczyć? [Zamknięte]

89

Wiem, że istnieje kilka różnych dialektów Lispa. Postanowiwszy, że nauka Lispa będzie nowym doświadczeniem intelektualnym, chciałbym wiedzieć, którego dialektu Lisp się nauczyć i dlaczego.

Czy jest taki, który jest bardziej popularny niż inne? Czy któryś z nich jest bardziej „kompletny”, lepiej udokumentowany i obsługiwany? Jakie są wady i zalety tego dialektu?

Humphrey Bogart
źródło
Poszukałem tego, zanim to zadałem, ale natura pytania ewoluowała, gdy je pisałem. Postaram się nie wymyślać koła na nowo.
Humphrey Bogart
Jaka jest więc różnica między tym pytaniem a tym, o którym Greg wspomniał powyżej?
cjs
2
Myślę, że chciał powiedzieć: Kiedy po raz pierwszy sformułowałem w myślach moje pytanie, było zupełnie inne niż obecne, a spojrzenie na pytania w powiązanym wyszukiwaniu nie ujawniło żadnego, które pasowało do tego, czego chciał zapytać. Ale zanim napisał pytanie, zmieniło się i pojawiło się na SO w obecnej formie, o którą zadawano wcześniej.
J. Polfer

Odpowiedzi:

77

Chcesz znaleźć równowagę między prostotą i czystością, atrakcyjnymi funkcjami oraz platformą, która pozwoli Ci napisać ciekawe i przydatne oprogramowanie (dla siebie), a także posłuży jako narzędzie do nauki. (Ta ostatnia sprawi, że będziesz mógł kontynuować naukę o wiele dłużej). Oto kilka możliwości:

  1. Schemat. Prawdopodobnie najczystszy ze wszystkich dialektów. Nie ma wątpliwości, dlaczego The Little Schemer został przetłumaczony z LISP na Scheme. Piąta standardowa specyfikacja Scheme, R5RS , jest wspaniałą edukacją samą w sobie; może to być najładniejsza specyfikacja języka i biblioteki, jaką kiedykolwiek czytałem, a także najkrótsza, w miarę obszerna. Platforma PLT Scheme (obecnie Racket) zawiera całkiem przyzwoity interpreter i kompilator, jest dobra do pisania skryptów, a także ma kilka narzędzi wizualnych, które sprawiają, że jest doskonała do nauki.

  2. Common Lisp. Prawdopodobnie najbardziej przenośny i wszechstronny wariant, najprawdopodobniej jest to, czego chcesz, jeśli chcesz pisać takie rzeczy, jak oprogramowanie komercyjne. Standard definiuje obszerne biblioteki, a wiele innych jest dostępnych poza tym, ma CLOS , który prawdopodobnie nauczy Cię więcej o OO niż jakikolwiek inny język OO, a niektóre kompilatory są bardzo dobre. Wady obejmują pewne brodawki, których Scheme nie ma (takich jak oddzielna przestrzeń nazw dla zmiennych odnoszących się do funkcji), nie są tak czyste i proste (jak w przypadku wszystkiego, co musiało mieć rozszerzenia i wymagało kompromisów dla dużych aplikacji w świecie rzeczywistym), nie posiadające higienicznych makr i podkreślające rekursję znacznie mniej niż Scheme.

  3. Clojure.Działa to na JVM, co może dać jej przewagę programistom Java. Ma kilka wad (np. Musisz wyraźnie poprosić o optymalizację wywołań ogonowych, chociaż może się to zmienić pewnego dnia, jeśli TCO zostanie dodany do JVM). Makra, choć nie są higieniczne, mają pewne funkcje, które pomagają uniknąć przechwytywania zmiennych, więc możesz przechwytywać zmienne, jeśli naprawdę chcesz, przy mniejszym ryzyku przypadkowego zrobienia tego niż w CL. Masz łatwy dostęp do wszystkich bibliotek Java; to prawdopodobnie dobra rzecz w przypadku kodu „w prawdziwym świecie” i raczej bezcelowa z punktu widzenia uczenia się. Posiada zestaw bibliotek dla trwałych struktur danych i wsparcie dla STM, co czyni go bardzo interesującym z jednoczesnego punktu widzenia; to sprawia, że ​​prawdopodobnie najlepiej będzie, jeśli chcą dowiedzieć się więcej o nowych metodach radzenia sobie z programowaniem współbieżnym i równoległym. Wygląda na to, że Clojure jest tak samo użyteczny dla dużych aplikacji produkcyjnych jak Java, w tym sensie, że będzie miał możliwość wykonywania „brzydkich rzeczy”, które robisz w aplikacjach produkcyjnych, których wolałbyś nie robić i których nie robisz kiedy się uczysz.

  4. Emacs Lisp. Jeśli chodzi o LISP, nie jest to jeden z lepszych przykładów. Jedną z jego największych wad jest dynamiczne określanie zakresu, ale jest też wiele innych. Jeśli jednak jesteś użytkownikiem Emacsa, może to być najpotężniejsze narzędzie, którego możesz się nauczyć, aby usprawnić korzystanie z edytora. To, ile naprawdę nauczyłbyś się ucząc Emacsa Lispa, poza tym, jak rozszerzyć Emacsa, jest dla mnie otwartą kwestią; Nie wiem, jak często interesujące techniki, takie jak funkcje wyższego rzędu, są naprawdę używane w Emacs Lisp.

Aktualizacja 2018

Minęło prawie dziesięć lat, odkąd napisałem ten post, a rodzina języków Lisp wydaje się teraz zyskiwać znaczną popularność w ogólnej świadomości programistów. Wiele z tego wydaje się być związanych z Clojure, który nie tylko stał się właściwie odrębnym dialektem Lispa, wprowadzając wiele własnych dobrych pomysłów, ale także ma teraz prawie identyczną wersję ukierunkowaną na JavaScript i zainspirował wiele innych Lisps kierowanie na inne platformy. Na przykład Hy jest ukierunkowany na CPython AST i kod bajtowy, dążąc najpierw do interoperacyjności z Pythonem, ale używając pomysłów Clojure „w razie wątpliwości”. (Chociaż od najnowszych zatwierdzeń, ten ostatni może się nieco zmienić.)

Dużą zmianą, jaką to wprowadza w procesie podejmowania decyzji, jest to, że powinieneś również przyjrzeć się językom Lisps lub podobnym do Lisp i współpracować z językami lub platformami, których już używasz, czy to Perl , Ruby , Erlang , Go, a nawet C ++ na mikrokontrolerach .

cjs
źródło
3
Posiadanie oddzielnych przestrzeni nazw nie jest brodawką, to po prostu inna decyzja projektowa. Należy pamiętać, że istnieje już kilka innych przestrzeni nazw również w Scheme, więc debata jest raczej Lisp-5 przeciwko Lisp-6. Oprócz wygody, jaką mogę nazwać listą "listą" i samochodem "samochodem" w CL, jego system makr jest o wiele bardziej praktyczny i użyteczny, ponieważ kompilator nie myli rzeczy tak łatwo.
Svante
Clojure nie ma optymalizacji wywołań końcowych i nie może, ponieważ kod bajtowy maszyny JVM jej nie obsługuje. Wszystko, co ma, to specjalna forma „rekurencyjna”, która automatycznie powtarza bieżącą funkcję.
Svante
3
Curt: Twierdzę, że Clojure jest najbardziej przenośny, ponieważ działa na maszynie wirtualnej Java.
justinhj
1
Nie wiem o tym; Jeśli wykluczysz małe i wbudowane urządzenia (takie jak telefony i karty inteligentne), na których i tak nie będziesz uruchamiać niezmodyfikowanego programu komputerowego / serwera, elisp z pewnością działa na znacznie większej liczbie procesorów i platform niż JVM.
cjs
1
Definitywnie się z tym nie zgadzam. Rekurencja ma tendencję do tworzenia kodu, który a) jest bardziej czysty, b) łatwiejszy do zweryfikowania, c) z większym prawdopodobieństwem będzie poprawny. Bardziej szczegółowo: a) ma tendencję do mniejszego dotykania mniejszej liczby zmiennych poza funkcją; b) dowód indukcyjny ma tendencję do naturalnego wypadania z funkcji rekurencyjnej, podczas gdy w przypadku pętli trzeba sprawdzić niezmienniki pętli itp .; c) niezawodność bierze się z a) i że masz tendencję do bycia zmuszanym do kodowania w sposób, który naturalnie sprawia, że ​​robisz (być może nieformalnie) dowód indukcyjny b).
cjs
22

Powiedziałbym Scheme, wyłącznie ze względu na Little Schemer , który jest jedną z najbardziej niesamowicie zabawnych, ale niezwykle trudnych książek, jakie kiedykolwiek próbowałem przeczytać.

J. Polfer
źródło
15
Nie zapomnij o SICP! mitpress.mit.edu/sicp . To jest klasyczna lektura.
Joris Timmermans
7
Były dwa lub trzy wydania The Little Lisper, zanim The Little Schemer wyszedł jako tłumaczenie tych.
cjs
9

Mogę polecić Common Lisp na SBCL . To połączenie jest szybkie, mocne, dojrzałe i dobrze udokumentowane.

Leslie P. Polzer
źródło
8

Również Clojure jest obecnie bardzo popularne i nie bez powodu. Wspaniałe struktury danych, bardzo dobra obsługa współbieżności (zawstydza Scheme i CL w tym względzie) i wspaniała społeczność. Jest również stosunkowo proste, język CL jest co najmniej tak skomplikowany jak C ++.

Nie oznacza to, że nie lubię CL ani Scheme. Nauczyłem się Scheme z SICP. CL zabrał mnie do Clojure. Przypuszczam, że wszystko zależy od twoich celów. Jeśli chcesz nauczyć się Lispa, który jest niezwykle praktyczny, wybierz Clojure. W przeciwnym razie CL lub Scheme są świetne.

dnolen
źródło
Wydaje się to sugerować, że ani CL, ani Scheme nie są „niezmiernie praktyczne”, podczas gdy w rzeczywistości są całkiem praktyczne. Zwłaszcza standard CL narodził się z praktycznych względów.
Leslie P. Polzer
2
Krajobraz języka programowania zmienił się od 1994 roku, nie wiem, jak zmieni się / ewoluuje standard CL, aby dostosować się do tego, czego nauczyliśmy się od tego czasu. Świat chwieje się do przodu i, o ile wiem, CL stoi w miejscu. Podoba mi się CL, Clojure ma jakiś sposób, aby zbliżyć się do swojej mocy, ale nie widzę, jak będzie się rozwijać CL - jeśli zamierzasz używać ustandaryzowanych języków, ścieżka ewolucyjna musi być oczywista. Bez tego język prawdopodobnie nie jest praktycznym wyborem.
dnolen
4
CL ewoluował i ewoluuje dzięki wielu bardzo przydatnym bibliotekom. Język bazowy był już w 1994 roku silniejszy niż wszystkie języki współczesne.
Svante
5

Wolę CL, ponieważ lubię programowanie obiektowe, a CLOS jest najładniejszym systemem obiektowym.

jrockway
źródło
5
Mówiąc o CL, poleciłbym ClozureCL lub SBCL. Oba są open source, dobrze udokumentowane, dojrzałe, wieloplatformowe i zapewniają kluczowe niestandardowe funkcje, takie jak wielowątkowość.
Daniel Dickison
5

Nauczyłem się Schematu w szkole. To było wspaniałe doświadczenie edukacyjne i nigdy nie zapomnę podstaw programowania funkcjonalnego. Prawdopodobnie nie ma znaczenia, którą wersję LISP-a wybierzesz, o ile rozumiesz sedno jego użyteczności - bezstanowy rachunek lambda.

Oto interesujący artykuł o tym, dlaczego MIT przeszedł ze schematu na Python w swoim wstępnym kursie programowania.

jinsungy
źródło
3

Powiedziałbym, że wszystkie, przynajmniej na początku. W końcu prawdopodobnie rozwiniesz preferencje dotyczące Scheme lub Common Lisp, ale oba mają wystarczająco dużo różnic, że najlepiej jest opanować wszystko, co tam jest.

Scheme ma na przykład kontynuacje i dobrze jest poznać te w Scheme, mimo że można je zaimplementować w Common Lisp.

Poznanie różnicy między zakresem leksykalnym i dynamicznym jest ważne, a jeśli nauczysz się zarówno Common Lispa, jak i elisp, napotkasz konsekwencje obu.

justinhj
źródło
0

LFE (Lisp Flavored Erlang) byłby miły. Możesz mieć składnię lisp na górze maszyny wirtualnej Erlang.


źródło
0

To było coś w rodzaju „załadowanego” pytania, ale OP prawdopodobnie o tym nie wiedział. Ogólnie rzecz biorąc, lispers Common i Scheme są jak "ludzie" z komputerów PC i Apple, nie mieszają się. Który z nich jest najlepszy, prawdopodobnie nie jest tak istotny, jak ten, który „działa” dla Ciebie. Naprawdę nie ma takiej różnicy. Prawdopodobnie na preferencję jednego z nich może mieć wpływ to, który z nich nauczysz się jako pierwszy. (Dla mnie pustą listą powinno być „nic”, znane w CL jako NIL, i to czyni mnie Common Lisper.) Podoba mi się integracja SBCL ze Slime przy użyciu EMACS, ale SBCL nie jest dla każdego. Po pierwsze, SBCL jest bardzo rygorystyczny. Jeśli chcesz po prostu "dobrze się bawić", GNU clisp jest łatwe i dostępne dla praktycznie każdej platformy.

Wiley
źródło