在Clojure中,为什么包含URL的块注释会抛出异常?

10

以下代码为什么不起作用?它为什么会抛出异常?:

(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))

)

这是URL中:/的组合。这两个字符在clojure中具有特殊含义,但不确定为什么它们不能在注释宏中使用。 - Kevin
1
@Kevin 因为即使不对宏进行求值,它们的主体仍然需要被解析。URL 不会被解析。 - Matt Fenwick
1个回答

10
由于URL不是有效的令牌:
Clojure> http://www.4clojure.com/problem/33
java.lang.RuntimeException: Invalid token: http://www.4clojure.com/problem/33

相比之下,你之前拥有的那个字符串在Clojure中可以被解读为表单:

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

也就是说,Clojure 无法解析第一个示例,无论它是否位于 (comment ...) 内。

为了完整起见,需要注意的是使用 ; 注释的 url 是可以正常工作的:

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

我是否最好始终使用分号作为注释,因为“comment”宏(从您那里学到的)会评估其内容? - user193116
3
@user193116 comment 不会对其内容进行求值,但是它的内容会被解析。我个人通常使用分号;来注释代码,因为它更加易于识别(而且现在也因为你发现的问题)。只有在匆忙或懒惰的情况下才会使用comment。我曾经和一个人一起工作,他从不删除代码,只是在代码周围加上(comment ...),使得阅读代码非常困难......但这只是个人品味,结果因人而异。 - Matt Fenwick
1
值得一提的是,#_ 阅读器语法指示阅读器不解析以下形式,以保证完整性。 - Hugh
2
@Huw 这是不正确的。你自己说了:“下面的表单。”所以,跟在 #_ 后面的表单必须像 comment 宏一样合法。两者之间的区别在于 comment 是一个宏,因此必须产生某些东西,即 nil。而对于 #_,该表单只是消失了。无耻的广告插入:“你知道评论吗?” - kotarak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接