欢迎!请参阅关于页面,了解更多此网站如何工作的信息。
已知的不具体定义区域(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 在 2011 年针对 CLJ-17 做了如下评论:“出于性能考虑,不在运行时进行验证。cemerick 的关于任意符号支持的提议是合理的,但任意符号支持是另一个项目/想法。” 我不知道有任何项目提议增强 Clojure 以支持任意符号,例如通过类似以下语法的
`
您认为创建一个增强票项以支持符号和关键字中的任意字符是否合理?
评论者:alexmiller
当然。我曾就此进行了一些调查,因为我的一个启示是从特性表达式开始的,而且 #| 已经为此潜在用途保留了。然而,与此相关有许多棘手的问题,而且我不期望它在近期内会发生 - 更可能的情形是,当其他原因需要时,我们被迫这样做。
评论者:bendlas
这是个错误的票项,但对于任何考虑使用 #|任意符号(或字符串)| 的人,请考虑使其分隔符可配置,就像 mime 多部分一样。
我目前创建了一个设计页面。我相信它并没有列出您找到的许多复杂问题。如果您愿意分享,我很乐意尝试记录它们。
http://dev.clojure.org/pages/viewpage.action?pageId=11862058
Herwig,您能否编辑我前一个评论中链接的设计页面,添加关于如何精确地说明MIME多部分如何配置分隔符的引用或示例,以及为什么您认为固定分隔符是一个坏主意?
我在设计页面上发表了评论。
移除了几个已在阅读器页面上澄清的问题,这些问题不再是问题。
评论者: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 issue)我想解释为什么连续的冒号是不允许的,并同步Clojure Reader和EDN规范。
更新的读取器规范规定,一个符号可以包含单个“/”来分隔命名空间。此外,它还提到裸“/”是除法函数。那么clojure.core//又是什么情况呢?这仍然应该是一个易于阅读的符号,对吧?所以这是对“单个/”规则的例外吗?foo.bar//也会是可读的符号吗?foo//bar又如何呢?
评论者:favila
另一个造成歧义的地方是,不清楚通用语符的关键字中的第一个冒号是关键字(和因此是符号)的第一个字符,还是它是特殊字符,规范真正描述的是从第二个字符开始的。这很重要,因为通用语符的规范(在edn和读取器规范中)是以与符号的差异来给出的。我认为许多奇怪的关键字边缘情况,包括::1 vs :a/1的法律性,都起源于这种歧义,不同的票据/补丁似乎选择了其中一个或另一个潜在假设。更多例子请参见(链接:http://dev.clojure.org/jira/browse/CLJS-677?focusedCommentId=35025&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-35025 文本:这个评论)。
我们可能可以 Keyword 和符号来创建或打印这些形式,当它们不可读时,简化它们的规范形式。例如,而不是生成复杂的解析规则以确保 clojure.core// 或 :1 是合法的,仅使字面形式简单,当用户遇到这些边缘案例时,让他们编写类似 #sym(link: "clojure.core" "/") 或 #kyw "1"(并让打印机打印这些 )。
我会说::(以及 ::)是语法标记,规范描述了随后的字符。但我同意,最好对此做更明确的说明。LispReader 中的(不正确)正则表达式也有帮助。
标记字面值的概念是| |语法的有趣替代品,已为可能未来对关键字和符号中非法字符的支持而保留。但我认为这个想法超出了此票据的范围,这个票据实际上关于澄清规范。
评论者:kunstmusik
来晚了,我在用户邮件列表中的
https://groups.google.com/forum/#!topic/clojure/CwZHu1Eszbk
提到,1.目前允许作为符号名称的一部分,所以
(let (link: a# 4 b#a 3) (println a1. b#a))
将打印"4 3"。