Ich habe dieses Makro, das definiert definiert. Wenn ich den "` '' Backtick entferne, wird es nicht funktionieren. Was ist die Erklärung?Was bedeutet Backtick in LISP?
(defmacro define ((name &rest r) body)
`(defun ,name ,r ,body))
Ich habe dieses Makro, das definiert definiert. Wenn ich den "` '' Backtick entferne, wird es nicht funktionieren. Was ist die Erklärung?Was bedeutet Backtick in LISP?
(defmacro define ((name &rest r) body)
`(defun ,name ,r ,body))
Apostroph durch die schriftliche Darstellung eines Wertes gefolgt wird dieser Wert produzieren:
Beispiel: ‚(1 x‚foo‘) einen Wert erzeugen, der als (1 x "foo")
druckt.
Angenommen, ich möchte kein Literalsymbol x
in der Liste. Ich habe eine Variable x
in meinem Programm, und ich möchte den Wert einfügen, auf den x
.
zu markieren, dass ich den Wert von x
anstatt das Symbol x
, will füge ich ein Komma vor x
:
'(1 ,x "foo")
Es wird nicht funktionieren, obwohl, wie sie ist - ich nun einen Wert ab, hat ein literales Komma sowie ein Symbol x
. Das Problem ist, dass quote
nicht über die Kommakonvention bekannt ist.
Graviszeichen oder backquote
weiß um die Komma-Konvention zu, dass das richtige Ergebnis geben:
> `(1 ,x "foo")
(1 3 "foo") ; if the value of x is 3
Lesen Sie mehr hier: http://www.lispworks.com/documentation/HyperSpec/Body/02_df.htm
Die Graviszeichen/Backquote deaktiviert die Auswertung für jeden subexpression nicht durch ein Komma für die Liste vorangestellt, die den Bediener folgt.
Aus dem gemeinsamen Lispenkochbuch, explanation and a few examples.
Großartig, ich habe es, vielen Dank. Eine Sache noch. Was macht dieser & Operator vor dem Rest? (& rest) – Alex
Mit '& rest' können Sie Funktionen definieren, die eine variable Anzahl von Argumenten haben. Angenommen, Sie möchten eine Plus-Funktion definieren, bei der sowohl (plus 2 3) als auch (plus 2 3 4) funktionieren. Diese Seite hat eine schöne Erklärung: http://www.gigamonkeys.com/book/functions.html – soegaard
Ich denke, es ist erwähnenswert, dass diese Funktion ** Quasiquoting ** oder ** Quasi-Quoting ** genannt wird. –