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?
Odpowiedzi:
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:
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.
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.
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.
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 .
źródło
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ć.
źródło
Mogę polecić Common Lisp na SBCL . To połączenie jest szybkie, mocne, dojrzałe i dobrze udokumentowane.
źródło
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.
źródło
Wolę CL, ponieważ lubię programowanie obiektowe, a CLOS jest najładniejszym systemem obiektowym.
źródło
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.
źródło
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.
źródło
LFE (Lisp Flavored Erlang) byłby miły. Możesz mieć składnię lisp na górze maszyny wirtualnej Erlang.
źródło
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.
źródło