Es ist anders in verschiedenen Lisp Dialekten. Folgendes verwendet Common Lisp:
Erste # 'ist eine kurze Notation für (Funktion ...). So sind die folgenden nur textlich anders, aber Common Lisp liest sie als die gleiche:
#'(lambda (x) (* x 2))
und
(function (lambda (x) (* x 2)))
#‘ist ein readmacro und verwandelt, wenn Lisp-Code durch das Lisp-System eingelesen wird.
Wenn Lisp
(function (lambda (x) (* x 2)))
die Lisp-System wertet erstellt eine Funktionsobjekt und Funktion gibt es als Wert.
Also, wenn Sie eine Funktion als Wert benötigen, dann müssen Sie es so schreiben. Eine Funktion als Wert wird benötigt, wenn Sie sie als Argument an eine andere Funktion übergeben möchten, wenn Sie sie von einer Funktion zurückgeben wollen oder wenn Sie sie in einer Variablen speichern wollen. Beispiele:
(map #'(lambda (x) (* x 2)) '(1 2 3))
(defun (y) #'(lambda (x) (* x y)))
(defparameter *twice-fn* #'(lambda (x) (* x 2)))
Nun, was ist (Lambda (x) (* x 2))?
Je nach Kontext gibt es zwei verschiedene Dinge.
Lambda Ausdruck
Der Ausdruck Lambda kann anstelle eines Funktionsnamen verwendet werden:
(function foo) and (function (lambda (x) (* x 2)))
und
(foo 17) and ((lambda (x) (* x 2)) 17)
Vor zwei rechtliche Common Lisp-Syntax. Dort kann ein Lambda-Ausdruck direkt verwendet werden.
Beachten Sie, dass die folgenden zwei Formen illegal in Common Lisp sind:
(#'(lambda (x) (* x 2)) 17) ; illegal in Common Lisp
(function #'(lambda (x) (* x 2))) ; illegal in Common Lisp
Makro
Während des Common Lisp Standardisierungsprozess ein Makro LAMBDA hinzugefügt wurde (es war nicht Teil die erste Beschreibung, CLtL1, von Common Lisp). Es ermöglicht einen etwas kürzeren Code zu schreiben. Beispiel:
(lambda (x) (* x 2))
Im obigen Fall ist LAMBDA ein Makro. Während Makroerweiterung wird es erweitert:
(function (lambda (x) (* x 2)))
Beachten Sie, dass in oben Funktionsform, der innere Teil einer Lambda Lambda-Ausdruck ist, bezeichnet die Funktion und wird nicht erweitert werden.
So, nun die drei Beispiele von oben kann geschrieben werden als:
(map (lambda (x) (* x 2)) '(1 2 3))
(defun (y) (lambda (x) (* x y)))
(defparameter *twice-fn* (lambda (x) (* x 2)))
Es etwas kürzer ist, ein bisschen weniger überladen aussieht und Schema Code etwas ähnlich sieht. Es sieht nur etwas besser für Programmierer aus, die zum Lesen und Schreiben von Programmcode verwendet werden.
Zusammenfassung
a) (function (lambda (x) (x * 2))) ist die 'wahre' Art und Weise, Code zu schreiben, der eine Funktion als ein Wert zurückgibt.
b) # '(lambda (x) (* x 2)) ist eine kürzere Notation von oben
c) (lambda (x) (* x 2)) ist noch kürzer, aber Makroerweiterung verwendet um die Form von a) zu erstellen.
Lisp hat keine Funktionszeiger, Makros sind nicht im variablen Raum, ... –