欢迎!有关本网站如何运作的更多信息,请参阅关于页面。
未明确指定的已知区域(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规范在这一点上是否应该相同,但为了这个ticket提及这一点似乎值得。
Alex,Rich在2011年对CLJ-17的评论:"出于性能原因,运行时验证已经取消。cemerick提出的任意符号支持使它们有效是个合理的建议,但任意符号支持是另一个ticket/idea。" 我不知道有任何ticket提出要增强Clojure,允许支持任意符号,例如通过像这样的语法
`
您认为为在符号和关键词中支持任意字符创建一个增强ticket是合理的吗?
评论者:alexmiller
当然。我对此了解一些,作为功能表达式的旁白,#|已经为潜在的使用而保留。然而,有许多棘手的问题,我不认为这会发生——更有可能是在为其他原因的必要推动时才进行。
评论者:bendlas
错误的ticket,但任何考虑在#|任意符号(或字符串)|中的人,请考虑将分隔符设置为可配置的,就像MIME多部分一样。
我已经创建了一个设计页面。我确信它并没有列出你找到的许多棘手问题。如果你愿意分享任何记录,我将很高兴尝试记录下来。
http://dev.clojure.org/pages/viewpage.action?pageId=11862058
Herwig,你能编辑我上次评论中链接的设计页面,添加一个关于mime multipart如何允许配置分隔符的引用或示例,以及为什么你认为固定分隔符是一个坏主意吗?
我在设计页面留言。
在阅读器页面澄清并已解决的几个问题上修正了问题。
评论人: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"。