Porównanie dialektów Lispa
Z Wikipedii
Lisp nie jest jednym językiem programowania, lecz całą rodziną różniących się czasem znacznie języków.
Najbardziej odbiegającym od tradycji Lispowej jest Scheme.
Spis treści |
[edytuj] Podstawowe stałe symboliczne
Stałe które występują w każdym Lispie to prawda, fałsz i lista pusta.
[edytuj] Scheme
- Prawda - #t
- Fałsz - #f
- Lista pusta - ()
[edytuj] Common Lisp i Emacs Lisp
- Prawda - t
- Fałsz - nil
- Lista pusta - nil, można używać też ()
[edytuj] Definicje
W Scheme istnieje tylko jeden rodzaj nazw obejmujący stałe i funkcje oraz zmienne "zwykłe" i zmienne funkcyjne. W Common Lispie i Emacs Lispie funkcje i stałe traktowane są inaczej.
Dla przykładu zdefiniujmy stałą 2π oraz funkcję wyższego rzędu która przekazaną funkcję aplikuje na argumentach 2 i 3.
[edytuj] Scheme
(define two_pi 6.28318) (define (apply2_3 f) (f 2 3)) (/ two_pi 3.14159) ;; 2.0 (apply2_3 +) ;; 5 (apply2_3 >) ;; #f
[edytuj] Common Lisp
Istnieją osobne systemy definiowania funkcji i definiowania stałych. Funkcje przekazywane jako argumenty trzeba poprzedzić #'
(defconstant two_pi 6.28318) (defun apply2_3 (f) (funcall f 2 3)) (/ two_pi 3.14159) ;; 2.0 (apply2_3 #'+) ;; 5 (apply2_3 #'>) ;; nil
[edytuj] Emacs Lisp
(defconst two_pi 6.28318) (defun apply2_3 (f) (funcall f 2 3)) (/ two_pi 3.14159) ;; 2.0 (apply2_3 #'+) ;; 5 (apply2_3 #'>) ;; nil
[edytuj] Operacje na listach
We wszystkich dialektach jest możliwe posługiwanie się podstawowymi operacjami:
- Konstruktor listy pustej: ()
- Konstruktor listy z pary głowa ogon: (cons głowa ogon)
- Bezpośrednia konstrukcja listy: '(element1 element2 element3 element4)
- Pobranie głowy: (car lista)
- Pobranie ogona: (cdr lista)
Zdefiniowane są też zwykle kombinacje dwóch do czterech car i cdr postaci, czytane z prawej do lewej, np.:
- (cadr '(1 2 3))
- (car (cdr '(1 2 3)))
- (car '(2 3))
- 2
Różnią się one traktowaniem listy nie zawierającej wystarczająco dużo argumentów - w Scheme jest to błąd, w Common Lisp i Emacs Lisp zwracany jest nil.
W Common Lisp i Emacs Lisp istnieją też aliasy:
- first, równy car - pierwszy element listy
- second, równy cadr - drugi element listy
- third, równy caddr - trzeci element listy
- itd., aż do tenth
[edytuj] Funkcje logiczne
W Scheme dość konsekwentnie stosuje się zasadę kończenia funkcji zwracających wartości logiczne znakiem zapytania:
(equal? 3 4) ;; #f (equal? 4 4) ;; #t
Czego nie robi się w innych omawianych Lispach:
(equal 3 4) ;; nil (equal 4 4) ;; t
Pytania o typ w Scheme kończą się również znakiem zapytania:
(number? "cztery") ;; #f (number? 4) ;; #t
Natomiast w innych Lispach literą p:
(numberp "cztery") ;; nil (numberp 4) ;; t
[edytuj] Funkcje anonimowe i mapowanie list
Funkcje anonimowe tworzy się za pomocą lambdy i stosuje jak normalne funkcje:
(lambda (x) (+ x 1)) ((lambda (x) (+ x 1)) 2) ;; 3
Do mapowania w Scheme służy funkcjonał map:
(map (lambda (x) (+ x 1)) '(1 2 3)) ;; (2 3 4)
W innych Lispach zaś mapcar:
(mapcar (lambda (x) (+ x 1)) '(1 2 3)) ;; (2 3 4)