2014-10-21 17 views

Antwort

11

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.

+1

Die Leiter Metapher @Galdre bezieht sich auf, ist von "Mastering Clojure Makros" https://pragprog.com/book/cjclojure/mastering-clojure-Macros – Chiron

+0

@Chiron Thanks. Ich konnte mich nicht erinnern, wo ich ihm begegnet war. – galdre

Verwandte Themen