是因为Clojure受JVM限制,所以这段代码无法评估?

时间:2016-08-20 05:25:27

标签: clojure

代码在Clojure中包含类似'(1+2)的内容会导致java.lang.RuntimeException,这会留下错误消息“Unmatched delimiter:)”。

但是在我曾经使用的任何其他lisp方言中,例如Emacs Lisp或Racket,'(1+2)只返回一个列表,应该这样做,因为使用特殊形式引用,列表中的任何内容都不应该被评估。

所以我只是想知道是因为JVM的限制所以这些代码不能像他们在其他方言中的行为那样行事吗?或者它是Clojure的错误?或者也许Clojure中的引用定义与其他lisp方言之间存在不同之处?

1 个答案:

答案 0 :(得分:1)

这些是使用不同语言设置标记器的方式的工件。在Clojure中,如果一个令牌以数字开头,它将被消耗,直到下一个读者宏字符(包括其他内容括号),空格或文件结尾(空格包括逗号)。消耗的内容必须是有效数字,包括整数,浮点数和理性。因此,当您向阅读器提供'(1+2)时,它会将1+2作为一个令牌使用,然后无法与整数,浮点数或有理数模式匹配。之后,读者尝试恢复,重置其状态。在此状态下,)无法匹配。

尝试输入'(1 + 2)(请注意+周围的空格),您将看到您期望的确切内容。