(def x 1)
user=> '`~x
x
user=> `'~x
(quote 1)
Kann jemand bitte erläutern, wie es Schritt für Schritt ausgewertet wird?Clojure - Unterschied zwischen Angebot und Syntax Zitat
(def x 1)
user=> '`~x
x
user=> `'~x
(quote 1)
Kann jemand bitte erläutern, wie es Schritt für Schritt ausgewertet wird?Clojure - Unterschied zwischen Angebot und Syntax Zitat
Der einfache Anführungszeichen-Operator gibt den Ausdruck oder das Symbol zurück, das Sie angeben, ohne ihn zu bewerten. Der Syntax-Anführungszeichen-Operator gibt den Ausdruck oder das Symbol, das Sie angeben (mit hinzugefügten Namensräumen), zurück, ohne sie zu bewerten. Der Syntax-Unquote-Operator "annulliert" den Syntax-Quote-Operator sozusagen, aber nicht das Single-Quote. Sie können Syntax-Anführungszeichen und Syntax-Unquotes verschachteln, um seltsame und wundervolle Talente auszuführen. Meine Lieblingsanalogie, die ich lese, um diese zu verstehen, besteht darin, Syntax-Quoting und Syntax-Noquoting als Aufwärts- und Abwärts-Sprossen einer Leiter zu betrachten (possible source).
In der Form `x
, x
ist Syntax zitiert, so dass es nicht ausgewertet wird; Stattdessen erhalten Sie ein Namespaced-Symbol (wie user/x
). Aber in der Form `~x
ist x
Syntax-unquoted wieder, so wird es ausgewertet:
user=> `~x
1
an Ihre Beispiele:
Beispiel 1
'
ist nur Zucker für (quote ...)
.
So '`~x
wird (quote `~x)
. Dies wird wiederum (quote x)
(denken Sie daran, dass `~
nicht wirklich etwas tut), weshalb der gesamte Ausdruck das Symbol x
auswertet.
Beispiel 2
In `'~x
, lassen Sie uns zuerst die '
mit quote
ersetzen: `(quote ~x)
. Der Ausdruck ist syntaxbezogen und wird daher nicht ausgewertet.
So können Sie sich den Ausdruck(quote ~x)
als "Zwischenschritt" vorstellen. Aber wir sind nicht fertig. x
innerhalb der Syntax-Zitat ist Syntax-nicht quoted, wie in meinem Beispiel oben. Auch wenn dieser Ausdruck als Ganzes nicht bewertet wird, wird x
sein, und sein Wert ist 1
. Am Ende erhalten Sie den Ausdruck: (quote 1)
.
Blog post über das Thema.
Sie meinen gleich "1". – Chiron