2012-08-16 7 views
10

Perché il seguente non funziona? Ecco perché genera un'eccezione ?:In clojure, perché un commento di blocco contenente un url genera un'eccezione?

(comment 

Replicate a Sequence 
http://www.4clojure.com/problem/33 

     (= (__ [1 2 3] 2) '(1 1 2 2 3 3)) 

) 

Sostituire l'url con un'altra stringa e sembra essere ok.

(comment 

Replicate a Sequence 
replace the url and all is well. why 

     (= (__ [1 2 3] 2) '(1 1 2 2 3 3)) 

) 
+0

è la combinazione di ': /' nell'URL. Entrambi i personaggi hanno un significato speciale nel clojure, ma non sono sicuro del motivo per cui non funzionerebbero nella macro dei commenti. – Kevin

+1

@Kevin perché i corpi delle macro devono ancora essere analizzati, anche se non vengono valutati. L'URL non viene analizzato. –

risposta

10

perché l'URL non è un token valida:

Clojure> http://www.4clojure.com/problem/33 
java.lang.RuntimeException: Invalid token: http://www.4clojure.com/problem/33 

considerando che l'altra stringa si aveva può essere letti come forme Clojure:

Clojure> (quote (replace the url and all is well. why)) 
(replace the url and all is well. why) 

Cioè, Clojure può analizzare il primo esempio, indipendentemente dal fatto che si trovi in ​​un (comment ...).

Per completezza, si noti che l'url è bene con un commento ;:

Clojure> 3 ; http://www.4clojure.com/problem/33 
3 
+0

sto meglio sempre usando ';' per i commenti come macro 'commento' (cosa ho imparato da te) valuta i suoi contenuti? – user193116

+3

@ user193116 'comment' non ** valuta ** il suo corpo - sebbene il suo corpo sia ** analizzato **. Io personalmente uso sempre ';' per i commenti, perché è più visivamente distintivo (e ora anche a causa del problema riscontrato). Userei solo "commenti" se fossi di fretta o pigro. Ho lavorato con un ragazzo una volta che non ha mai cancellato il codice, basta mettere '(commento ...)' intorno ad esso - ha reso molto difficile leggere il codice. ... ma questo è solo un gusto personale. YMMV. –

+1

Per completezza, vale la pena notare che la sintassi del lettore '# _' indica al lettore di non analizzare il seguente modulo. – Hugh

Problemi correlati