2015-05-10 5 views
5

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)) 

Antwort

10

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

+0

Großartig, ich habe es, vielen Dank. Eine Sache noch. Was macht dieser & Operator vor dem Rest? (& rest) – Alex

+1

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

+1

Ich denke, es ist erwähnenswert, dass diese Funktion ** Quasiquoting ** oder ** Quasi-Quoting ** genannt wird. –

5

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.