欢迎!请查看关于页面以了解更多此平台的使用信息。
已知的不明确领域(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,你能编辑我之前评论中提到的设计页面,添加一个引用或示例来确切说明如何配置多部分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 问题)关于连续冒号。我想说明为什么连续冒号不允许使用,并使 Clojure 读取器和 EDN 规范在这个问题上保持一致。
更新的读取器规范说明,符号可以包含一个斜杠(/)来分隔命名空间。它还提到裸斜杠(/)是除法函数。那么 clojure.core// 呢?这仍然是一个可读的符号,对吧?那么这是不是“单斜杠”规则的例外呢?foo.bar// 也可读吗?foo//bar 呢?
评论者:favila
我看到的另一个歧义之源在于,关键字的开头冒号是否是关键字的第一个字符(因此也是符号的第一个字符),或者它是否是特殊字符,规范真正描述的是从第二个字符开始发生了什么。这很重要,因为关键字规范(在 edn 和读取器规范中)是以与符号的差异来给出的。我认为很多奇怪的关键字边缘案例(包括 :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 (link: a# 4 b#a 3) (println a1. b#a))
将打印 "4 3"。