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 .