2012-08-16 8 views
10

次のコードが機能しないのはなぜですか?だからこそ例外を投げるのはなぜですか?:clojureでは、URLを含むブロックコメントで例外が発生するのはなぜですか?

(comment 

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

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

) 

URLを別の文字列に置き換えても問題ありません。

(comment 

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

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

) 
+0

、それは 'の組み合わせです:/' URLインチどちらの文字もclojureでは特別な意味を持っていますが、なぜコメントマクロではうまくいかないのか分かりません。 – Kevin

+1

@Kevinマクロのボディは、まだ評価されていなくても解析されなければならないためです。 urlは解析しません。 –

答えて

10

URLが有効なトークンではありませんので:ある

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

、Clojureのは、次のことができます。あなたは Clojureの形態として読み取ることができなかった他の文字列のに対し

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

(comment ...)にあるかどうかにかかわらず、最初の例を解析しません。完全のために

、URLは;コメントと罰金であることに注意してください。

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

私はいつも ';' 「コメント」マクロ(私があなたから学んだもの)としてコメントの内容を評価しますか? – user193116

+3

@ user193116 'コメント'は**そのボディを評価しません** - ボディは**解析されています**。私は個人的にはコメントに ';'を使用しています。なぜなら、視覚的にははっきりしているからです。私が急いでいる、または怠けている場合、私は 'comment'を使用します。コードを削除したことのない人と一緒に働いていました。ちょうど '(comment ...)'を置くだけで、コードを読みにくくなりました。 ...それはただの個人的な味です。 YMMV。 –

+1

完全性のために、 '#_'リーダ構文は、次のフォームを解析しないように読者に指示しています。 – Hugh

関連する問題