欢迎!请查看关于页面以了解更多关于如何使用本系统的工作信息。
已知的不确定性区域(https://clojure.org/reader#The Reader--Reader forms)
参考资料
评论者:jafingerhut
Clojure阅读器的文档也没有提及以下符号作为合法组成部分。在这里的EDN readme中,它们都被列为有效的符号组成部分:https://github.com/edn-format/edn#symbols
美元符号 - 在Clojure/JVM中用于分隔Java子类名和类名,例如 java.util.Map$Entry百分号 - 不确定为什么它是edn规范的一部分。在Clojure中,它似乎只用于#()内作为参数的% %1 %&符号“&” - 如在宏定义中的 &form 和 &env 中等号 - clojure.core/= 等小于号 - clojure.core/< clojure.core/<=大于号 - clojure.core/> clojure.core/>=
我不知道Clojure和edn规范在这方面是否应该相同,但似乎值得在这里提一下。
Alex,Rich在2011年对CLJ-17发表了以下评论:“出于性能原因,运行时验证已放弃。cemerick关于任意符号支持的建议是可行的,但任意符号支持是另一个条目/想法。”我不知道有任何条目提议增强Clojure以支持任意符号,例如通过以下语法:
`
您认为为在符号和关键字中支持任意字符创建一个增强条目合理吗?
评论者:alexmiller
当然。我对此稍作研究,因为特征表达式是此潜在用途的预留符号。然而,有许多棘手的问题,并且我不期望这种情况很快会发生 - 更可能是在有必要做一些其他事情时才会得到推动。
评论者:bendlas
错误的条目,但任何考虑#|任意符号(或字符串)|的人,请考虑使其定界符可配置,如mime多部分。
我目前创建了一个设计页面。我相信它没有列出您发现的许多棘手的问题。如果您愿意分享任何笔记,我将很乐意尝试记录这些问题。
http://dev.clojure.org/pages/viewpage.action?pageId=11862058
Herwig,您能否编辑我上一条评论中提到的设计页面,添加一个关于如何配置多部分分界符的引用或示例,以及为什么您认为固定分界符是一个不好的主意?
我在设计页面上进行了评论。
删除了一些已经在阅读器页面上 clarified 并不再成为问题的几个问题。
评论者:bronsa
相关于 CLJ-1530
评论者:adamfrey
关于这一点:Clojure阅读器将不接受包含连续冒号的符号和关键字(见(链接:https://github.com/clojure/clojure/commit/005ea1b5f96c5bb762e155032a865e29ad71bcf3#diff-3a5dca122734225f3f60263876401aebR275文本:LispReader.java)),尽管这符合当前的EDN规范。以下是一个(链接:https://github.com/edn-format/edn/issues/68文本:GitHub问题),关于连续冒号的讨论。我想论证连续冒号为何不被允许,并使Clojure阅读器和EDN规范在此问题上保持一致。
更新后的阅读器规范指出,一个符号可以包含单个/作为命名空间的分隔符。它还提到裸/是除法函数。关于 clojure.core// 又如何呢?这仍然应该是一个易于阅读的符号吧?这是否是单斜杠 '/' 规则的一个例外吗?foo.bar// 也会被阅读吗?foo//bar 呢?
评论者:favila
我认为另一个产生歧义的来源是,不清楚关键字的第一个冒号是关键字(以及符号)的第一个字符,还是它具有特殊的含义,规范实际上是从第二个字符开始的描述。这很重要,因为(在 edn 和 reader 规范中)关键字的指定是以与符号的差异来表达的。我认为许多奇怪的边缘案例(包括 :1 对比 :a/1 的合法性)都源自这种歧义,不同的票据/补丁似乎选择了基于这种假设的一个或另一个。请参见(链接:http://dev.clojure.org/jira/browse/CLJS-677?focusedCommentId=35025&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-35025 文本:此评论)以了解更多示例。
我们可能可以使用标记字面量来实现关键字和符号的打印,当它们不可读时创建或打印这些形式,并简化这些字面量的读取器规范。例如,而不是生成复杂的解析规则来确保 clojure.core// 或 :1 是合法的,我们可以使字面量简单,当遇到这些边缘情况时让用户编写类似 #sym(link: "clojure.core" "/") 或 #kyw "1" 的内容(以及让打印器打印这些)。
我会说 :(以及 ::)是语法标记,规范描述了其后的字符。但我同意有必要对此进行更明确的说明。LispReader 中的(错误的)正则表达式也没有帮助。
标记字面量的想法是 | | 语法的一个有趣的替代方案,该语法被预留用于将来可能对没有效字符的关键字和符号的支持。但我认为这个想法超出了这个票据的范围,这个票据真正关于是要澄清规范。
评论者:kunstmusik
虽然来得晚了,我在用户邮件列表
https://groups.google.com/forum/#!topic/clojure/CwZHu1Eszbk
提到了,当前 1 被允许作为符号名称的一部分,也就是说
(let (a# 4 b#a 3) (println a1. b#a))
将打印 "4 3"。