2014-10-21 14 views

risposta

11

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.

+1

La metafora ladder @galdre si riferisce a, è da "Mastering Clojure Macros" https://pragprog.com/book/cjclojure/mastering-clojure-macros – Chiron

+0

@Chiron Grazie. Non ricordavo dove l'avevo incontrato. – galdre

Problemi correlati