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).
Lisp nie ma wskaźników funkcji, makra nie znajdują się w przestrzeni zmiennej, ... –