【问题标题】:In clojure, why does a block comment containing a url throw an exception?在clojure中,为什么包含url的块注释会抛出异常?
【发布时间】:2012-08-16 14:25:42
【问题描述】:

为什么以下不起作用?这就是为什么它会抛出异常?:

(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 因为宏的主体仍然需要解析,即使它们没有被评估。网址无法解析。

标签: clojure functional-programming


【解决方案1】:

因为 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 ...) 中。

为了完整起见,请注意网址可以带有; 注释:

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

【讨论】:

  • 我最好总是使用'​​;'为 cmets 作为“评论”宏(我从你那里学到的)评估其内容?
  • @user193116 comment评估它的主体——尽管它的主体已经解析。我个人总是将; 用于cmets,因为它在视觉上更具特色(现在也因为您发现的问题)。如果我赶时间或懒惰,我只会使用comment。我曾经和一个从不删除代码的人一起工作,只是在它周围加上(comment ...)——这让阅读代码变得非常困难。 ...但这只是个人品味。 YMMV。
  • 为了完整起见,值得注意的是#_阅读器语法指示阅读器不要解析以下表单。
  • @Huw 这是不正确的。你自己说:“下面的表格。”所以#_ 后面的形式必须像comment 宏一样合法。两者的区别在于comment 是一个宏,因此必须产生一些东西,即nil。使用#_ 时,表单就会消失。无耻插件:"Did you know about comments?"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-17
  • 1970-01-01
  • 1970-01-01
  • 2021-04-28
  • 2013-09-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多