(def x 1)
user=> '`~x
x
user=> `'~x
(quote 1)
Qualcuno può spiegare per favore come viene valutato passo dopo passo?Clojure - differenza tra citazione e sintassi quote
(def x 1)
user=> '`~x
x
user=> `'~x
(quote 1)
Qualcuno può spiegare per favore come viene valutato passo dopo passo?Clojure - differenza tra citazione e sintassi quote
L'operatore di quota singola restituisce l'espressione o il simbolo che si sta citando senza valutarlo. L'operatore syntax-quote restituisce l'espressione o il simbolo che si sta citando (con gli spazi dei nomi aggiunti), senza valutarlo. L'operatore syntax-unquote "annulla" l'operatore syntax-quote, per così dire, ma non la singola virgoletta. Puoi annidare citazioni di sintassi e sintassi-unquote per eseguire imprese strane e meravigliose. La mia analogia preferita che ho letto per comprenderli è considerare la sintassi-sintassi e la sintassi-unquoting come spostamento su e giù per i pioli di una scala (possible source).
Nel formato `x
, x
è sintassi-quotato, quindi non viene valutato; invece, si ottiene un simbolo di namespace (come user/x
). Ma nella forma `~x
, x
è sintassi non quotate di nuovo, quindi è valutata:
user=> `~x
1
ai vostri esempi:
Esempio 1
'
è solo zucchero per (quote ...)
.
Quindi '`~x
diventa (quote `~x)
. Questo a sua volta diventa (quote x)
(ricorda che lo `~
non fa realmente nulla), motivo per cui l'intera espressione valuta il simbolo x
.
Esempio 2
In `'~x
, si deve prima sostituire il '
con quote
: `(quote ~x)
. L'espressione è citata sulla sintassi, quindi non verrà valutata.
Quindi è possibile pensare a l'espressione(quote ~x)
come "passaggio intermedio". Ma non abbiamo finito. x
all'interno della sintassi-citazione è la sintassi-non quotata, proprio come nel mio esempio sopra. Pertanto, anche se questa espressione nel suo complesso non verrà valutata, sarà x
e il suo valore è 1
. Alla fine, ottieni l'espressione: (quote 1)
.
Blog post sull'argomento.
Intendi uguale a '1'. – Chiron