Dobry przykład różnic i różnic
między dialektami:
strings
| common lisp | scheme | clojure | emacs lisp
character literals | #\a #\Space #\Newline #\Backspace #\Tab #\Linefeed #\Page #\Return #\Rubout | #\a #\space #\newline #\backspace #\tab #\linefeed #\page #\return #\nul #\vtab #\alarm #\esc #\delete not in racket: #\alarm #\esc #\delete | \a \newline \space \backspace \tab \formfeed \return | ?a ?\b ?\t ?\n ?\f ?\r ?" ?\ ?\ooo ?\uhhhh ?\xh - ?\xhhhhhh ?\C-x ?\M-x
string literal | "foo bar" | "foo bar" | "foo bar" | "foo bar"
string escapes | " \ | \t \n \r " \ \ooo \uhhhh | \b \t \n \f \r " \ \ooo \uhhhh | \b \t \n \f \r " \ \ooo \uhhhh \xh - \xhhhhhh \C-x \M-x
character access | (char "foo" 0) | (string-ref "foo" 0) | (.charAt "foo" 0) | (aref "foo" 0)
find substring | (search "bar" "foo bar") | racket: (require srfi/13/string) (string-contains "foo bar" "bar") | (.indexOf "foo bar" "bar") | (search "bar" "foo bar")
extract substring | (subseq "foo bar" 4 7) | (substring "foo bar" 4 7) | (.substring "foo bar" 4 7) | (substring "foo bar" 4 7)
length | (length "foo") | (string-length "foo") | (.length "foo") | (length "foo")
Więcej tutaj: http://hyperpolyglot.org/lisp
A pomijając te urocze niekompatybilności - różnice są większe niż tylko to. Ciężko to podsumować w paru słowach, ale (tylko języki z powyższej tabelki):
Common Lisp jest najbardziej popularnym dialektem w zasadzie, to chyba najbardziej udana standaryzacja tego języka (może dlatego że ma porządną oficjalną specyfikację ;P). Podobnie, jest najbardziej praktycznym 'czystym'
(jakkolwiek by to nie zabrzmiało) LISP-em. Można by się rozwodzić, popatrz chociażby na drugą z moich podanych książek (podobnie jak pierwsza jest dostępna za darmo w internecie) i sam zobaczysz o co w tym chodzi.
Scheme w porównaniu z nim to czysty minimalizm (dodatkowo Scheme to lisp-1 który jest IMO przyjemniejszy od CL-owego lisp-2). Biblioteka standardowa i konstrukcje języka są naprawdę minimalne, za to nacisk jest położony na rozszerzalność
języka (nie żeby CL nie był). Z tego powodu nadaje się bardzo dobrze do nauki pewnych abstrakcyjnych pojęć (patrz: SICP), ale jest (jeszcze) mniej stosowany w praktyce. (Btw, jest jeszcze racket w którym nie pisałem - to rozszerzenie scheme, poczytaj np. na wiki).
Co jeszcze, Clojure - lisp oparty na maszynie wirtualnej Javy, zdobywa ostatnio coraz większą popularność. W sumie ma szansę stać się praktycznym i stosowanym językiem, ale pod kilkoma względami odchodzi mocno od 'idei' lispów (chociażby podmiana większości list na wektory i słabszy nacisk na funkcyjność) - w imię interoperacji z Javą głównie.
No i krótko o Emacs Lispie. Nie jest to najfajniejszy przykład tutaj, bo to język który istnieje głównie dzięki temu że jest podstawą działania pewnego edytora. Z tego powodu jest szeroko stosowany (w tym 0.1% ludzkości które używa emacsa), ale jako język ma pewne wady i archaizmy (np. brak lexical scope).
To co bym wybrał na Twoim miejscu to zależy jaki kompromis między 'edukacyjnością' a 'praktycznością' Cię zadawala ;].