代码在Clojure中包含类似'(1+2)
的内容会导致java.lang.RuntimeException
,这会留下错误消息“Unmatched delimiter:)”。
但是在我曾经使用的任何其他lisp方言中,例如Emacs Lisp或Racket,'(1+2)
只返回一个列表,应该这样做,因为使用特殊形式引用,列表中的任何内容都不应该被评估。
所以我只是想知道是因为JVM的限制所以这些代码不能像他们在其他方言中的行为那样行事吗?或者它是Clojure的错误?或者也许Clojure中的引用定义与其他lisp方言之间存在不同之处?
答案 0 :(得分:1)
这些是使用不同语言设置标记器的方式的工件。在Clojure中,如果一个令牌以数字开头,它将被消耗,直到下一个读者宏字符(包括其他内容括号),空格或文件结尾(空格包括逗号)。消耗的内容必须是有效数字,包括整数,浮点数和理性。因此,当您向阅读器提供'(1+2)
时,它会将1+2
作为一个令牌使用,然后无法与整数,浮点数或有理数模式匹配。之后,读者尝试恢复,重置其状态。在此状态下,)
无法匹配。
尝试输入'(1 + 2)
(请注意+
周围的空格),您将看到您期望的确切内容。