2009-05-26 14 views
13

Dlaczego powinienem używać # 'razem z lambda? Zwykle jest napisane w ten sposób, więc myślę, że jest to dobra forma. Ale te linie wydają mi się równe:Dlaczego używać # 'z lambda?

> (mapcar #'(lambda (x) (+ x 1)) '(1 2 3)) 
(2 3 4) 
> (mapcar (lambda (x) (+ x 1)) '(1 2 3)) 
(2 3 4) 

Czy ktoś chce oświecić początkującego o różnicy?

Odpowiedz

11

jest skrótem dla function, który zwraca wskaźnik do funkcji (zamiast jej stosowania). lambda zwraca funkcję i zwykle chcemy mieć wskaźnik do tej funkcji. Ponieważ jest to tak powszechne, istnieje również makro (w przestrzeni zmiennej), które robi to za Ciebie, co również nazywa się lambda. Obie linie kodu są identyczne.

Co jest lepsze sprowadza się do Lisp-1/Lisp-2 debate: w Common Lisp możesz to zrobić, dzięki makro. Jak zawsze, bądź konsekwentny.

+0

Lisp nie ma wskaźników funkcji, makra nie znajdują się w przestrzeni zmiennej, ... –

14

Jest inny w różnych dialektach Lisp. Następujące zastosowania Common Lisp:

Pierwsza # 'jest krótką notacją dla (funkcja ...). Więc po to tylko tekstowo różne, ale Common Lisp czyta je jako takie same:

#'(lambda (x) (* x 2)) 

i

(function (lambda (x) (* x 2))) 

#”jest readmacro i przekształca gdy kod Lisp jest odczytywany przez system Lisp.

Jeśli Lisp ocenia

(function (lambda (x) (* x 2))) 

systemu Lisp tworzy obiekt funkcji i zwraca go jako wartość.

Tak więc, gdy potrzebujesz funkcji jako wartości, musisz ją zapisać w ten sposób. Funkcja jako wartość jest potrzebna, gdy chcesz przekazać ją do innej funkcji jako argument, kiedy chcesz zwrócić ją z funkcji lub gdy chcesz zachować ją w zmiennej. Przykłady:

(map #'(lambda (x) (* x 2)) '(1 2 3)) 

(defun (y) #'(lambda (x) (* x y))) 

(defparameter *twice-fn* #'(lambda (x) (* x 2))) 

Co to jest (lambda (x) (* x 2))?

To dwie różne rzeczy w zależności od kontekstu.

wyrażenie lambda

Wyrażenie lambda może być używana zamiast nazwy funkcji:

(function foo) and (function (lambda (x) (* x 2))) 

i

(foo 17) and ((lambda (x) (* x 2)) 17) 

dwóch powyższych są składnia Common Lisp prawny. Można użyć wyrażenia lambda bezpośrednio.

Należy pamiętać, że następujące dwie formy są nielegalnej w Common Lisp:

(#'(lambda (x) (* x 2)) 17) ; illegal in Common Lisp 

(function #'(lambda (x) (* x 2))) ; illegal in Common Lisp 

Makro

Podczas wspólnej procesie normalizacji Lisp makro LAMBDA została dodana (nie był częścią pierwszy opis, CLtL1, Common Lisp). Umożliwia napisanie nieco krótszego kodu. Przykład:

(lambda (x) (* x 2)) 

W powyższym przypadku LAMBDA to makro. Podczas makr zostanie rozszerzony:

(function (lambda (x) (* x 2))) 

Należy pamiętać, że w powyższej postaci funkcyjnych, wewnętrzna N stanowi część wyrażenia lambda, oznacza funkcję, a nie zostaną rozszerzone.

Więc teraz trzy przykłady z powyżej można zapisać jako:

(map (lambda (x) (* x 2)) '(1 2 3)) 

(defun (y) (lambda (x) (* x y))) 

(defparameter *twice-fn* (lambda (x) (* x 2))) 

Jest nieco krótszy, wygląda trochę mniej zaśmiecone i wygląda nieco bardziej podobny do kodu systemu. Wygląda to nieco lepiej dla programistów używanych do odczytu i zapisu kodu Scheme.

Podsumowanie

a) (function (lambda (x) (* x 2))) jest 'prawdziwy' sposób pisać kod, który zwraca funkcję jako wartość.

b) # '(lambda (X) (* x 2)) jest mniejsza oznaczenie powyżej

c) (N (x) (* x 2)) jest nawet krótszy, ale używa makr stworzyć formę a).

Powiązane problemy