欢迎!请查看关于页面以获取更多有关如何使用此工具的信息。
未明确指定区域总结(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 %&Ampersand - 如在宏定义中的 &form 和 &env 中一样。等于 - clojure.core/= 以及许多其他函数。小于 - clojure.core/< 和 clojure.core/<=。大于 - clojure.core/> 和 clojure.core/>=。
不知道Clojure和edn规范在这方面是否应该相同,但我觉得值得在这个问题中提及。
Alex,Rich在2011年的CLJ-17中作出了以下评论:“出于性能原因,不再运行时验证。Cemerick建议对任意符号的支持会使它们有效是合理的,但对任意符号的支持是一张不同的票据/想法。” 我不知道有任何票据提出增强Clojure以支持任意符号,例如通过以下语法:
`
你认为为支持符号和关键字中的任意字符创建一个增强票据是否合理?
评论者:alexmiller
当然。我知道一些关于功能表达式的信息,但是 #| 已经 reserves for this potential use。然而,它有许多复杂的问题,我不认为它会很快发生 - 更可能是在需要时出于其他原因被迫采取的行动。
评论者:bendlas
这是错误的票据,但请考虑为任意符号(或字符串)创建可配置的分隔符,就像在mime多部分中那样。
我目前已经创建了一个设计页面。我相信它没有列出您发现的许多复杂问题。如果您愿意共享笔记,我将很高兴尝试记录它们。
http://dev.clojure.org/pages/viewpage.action?pageId=11862058
Herwig,您能否编辑我之前评论中链接的设计页面,添加一个参考或示例,精确说明如何配置MIMEmultipart的分隔符,以及为什么您认为固定的分隔符是个坏主意?
我在设计页面上进行了评论。
去除了一些在阅读页面上已澄清且不再是问题的几个问题。
评论者: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 Reader和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("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"。