Lisp i co o nim sądzicie.

0

Witam. Dzisiejszego wieczora (popołudnia?) przeglądając insternet trafilem na pare manifestów związanych z egzotycznym jak dla mnie językiem, jakim jest Lisp. Jako że manifesty czytać lubię (a "Katedra i bazar" jest moim ulubionym) to przeczytąlem wszystko co znalazłem. Jeśli jest ktoś ciekawy to mogę olinkować:

http://www.devblogi.pl/2009/09/niebezpieczne-java-szkoy.html
http://www.paulgraham.com/diff.html
http://www.paulgraham.com/icad.html
http://www.defmacro.org/ramblings/lisp.html
http://www.paulgraham.com/avg.html

No i tak się zaczęło. Zacząłem czytać o Lispie, jakich to on możliwości nie daje, że jest w programowaniu tym czym w Matrixie czerwona pigułka etc. i w końcu postanowiłem się jej pouczyć, jeśli nawet na nią nie przestawić.
I teraz pytanie do starych wyjadaczy (ale ci młodsi wyjadacze też ujdą ;) ), od jakich książek zacząć? Najlepiej aby miały one dobre polskie tłumaczenia. Jeśli będą wybitne, a jednocześnie dostępne tylko po angielsku to nic się nie stanie, ale jestem cienki z technicznego anglosaskiego. No i pytanie które nurtuje mnie najbardziej, to jaki Lisp jest tym "właściwym"? Standard ustalony przez ANSI? Jakiś inny dialekt?
Z góry dziekuję i pozdrawiam!

0

Ogólnie najpopularniejszymi standardami są:

  • Common Lisp
  • Scheme
  • Clojure

Co do książek to poszukaj tu i tu.

0

W dawnych czasach dużo programowałem w AutoLISPie. Była to odmiana LISPa przeznaczonego specjalnie do pisania bibliotek do programu AutoCAD. Z tego co pamiętam to nawiasy, nawiasy, nawiasy .........

0

Ja bym polecił
Structure and Interpretation of Computer Programs
http://mitpress.mit.edu/sicp/
Przyda Ci się nawet jeśli minie Ci pasja na Lispa ;]. Zdecydowanie największy klasyk z tych trzech które tutaj podaję.
Dialekt Lispa który tam jest opisywany to Scheme, nie powinno Ci to przeszkadzać raczej.

Jeśli wolisz coś o Common Lispie (który jest bardziej 'praktyczny' w popularnym tego słowa znaczeniu, co z drugiej strony oznacza że jeśli nie spróbujesz to łatwo pisać tak samo imperatywnie jak, dajmy na to, w C), niezła jest (szczególnie dla początkującego)
http://www.gigamonkeys.com/book/

I tak samo o Common Lispie, znacząco starsza ale ciesząca się sporą renomą (sam autor jest nie-byle-kim jeśli chodzi o Lispa):
http://www.paulgraham.com/onlisp.html

0

ok, a jaka jest roznica pomiedzy scheme a common lisp? od ktorego zaczac jesli ewentualna pozniejsza nauka drugiego nie bedzie klopotem?

0

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 ;].

0

W takim razie sądzę że wezmę się na początek za SICP. Jeśli już uda mi się ogarnąć Scheme, może wezmę się CL. Wielkie dzięki za wytłumaczenie tego wszystkiego.

0
msm napisał(a):

podmiana większości list na wektory i słabszy nacisk na funkcyjność) - w imię interoperacji z Javą głównie

http://www.infoq.com/presentations/Simple-Made-Easy, przejdz do 25:00 tam jest slajd w ktorym Rich Hickey (tworca clj) mowi o nawiasach i dlaczego. Ja sie z nim tutaj zgadzam, czyta sie clj o wiele prosciej niz inne lispy ktore czytalem.
Slabszy nacisk na funkcyjnosc - tutaj bys musial troche rozwinac, bo myslaelm ze clj to jest jezyk funkcyjny (ale nie pure!)

1

Lisp i co o nim sądzicie

((((()(()))())(()))(((()(()))())(())))
0

Każdy język funkcyjny, który wybierzesz i faktycznie stworzysz w nim senswony projekt, będzie fajnym osiągnięciem i doświadczeniem. Pytanie w którym się szybko nie zniechęcisz :)
Osobiście wybrałem Clojure, bo mam do dyspozycji cały dorobek JVM.
Np. aby narysować coś na ekranie wystarczy mi przestawić się na nowy paradygmat i nie muszę zaśmiecać mózgu kolejną biblioteką do wyświetlania pixela/bitmapy/podstaw_co_chcesz.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0