2024 年 Clojure 状态调查中分享您的想法!

欢迎!请查看关于页面以了解更多关于如何使用本系统的工作信息。

+2 票票
语法和读者

已知的不确定性区域(https://clojure.org/reader#The Reader--Reader forms

  • 符号(和关键字)描述未提及目前由 Clojure 函数(如 <, >, =, $,用于 Java 内部类),&(宏中的 &form 和 &env),%(在 edn 规范中声明为有效)使用的构成字符
  • 关键字目前接受以数字字符开头的字符,这与规范相矛盾 - 请参阅 CLJ-1286

参考资料

简要查看当前页面(指南:https://clojure.org/guides/weird_characters 和参考:https://clojure.org/reference/reader), 似乎其中一些已被解决,但并非全部。

我想知道这个提问和相关 Jira 任务是否过时,它们是否应该更新/关闭。

15 答案

0 票票

评论者: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规范在这方面是否应该相同,但似乎值得在这里提一下。

0 票票

评论者:jafingerhut

Alex,Rich在2011年对CLJ-17发表了以下评论:“出于性能原因,运行时验证已放弃。cemerick关于任意符号支持的建议是可行的,但任意符号支持是另一个条目/想法。”我不知道有任何条目提议增强Clojure以支持任意符号,例如通过以下语法:

`

|空格和任意#$@)$~)))@字符在这里|

`

您认为为在符号和关键字中支持任意字符创建一个增强条目合理吗?

0 票票

评论者:alexmiller

当然。我对此稍作研究,因为特征表达式是此潜在用途的预留符号。然而,有许多棘手的问题,并且我不期望这种情况很快会发生 - 更可能是在有必要做一些其他事情时才会得到推动。

0 票票

评论者:bendlas

错误的条目,但任何考虑#|任意符号(或字符串)|的人,请考虑使其定界符可配置,如mime多部分。

0 票票

评论者:jafingerhut

我目前创建了一个设计页面。我相信它没有列出您发现的许多棘手的问题。如果您愿意分享任何笔记,我将很乐意尝试记录这些问题。

http://dev.clojure.org/pages/viewpage.action?pageId=11862058

0 票票

评论者:jafingerhut

Herwig,您能否编辑我上一条评论中提到的设计页面,添加一个关于如何配置多部分分界符的引用或示例,以及为什么您认为固定分界符是一个不好的主意?

0 票票

评论者:bendlas

我在设计页面上进行了评论。

0 票票

评论者:alexmiller

删除了一些已经在阅读器页面上 clarified 并不再成为问题的几个问题。

0 票票

评论者:bronsa

相关于 CLJ-1530

0 票票

评论者: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规范在此问题上保持一致。

0 票票

评论者:bendlas

更新后的阅读器规范指出,一个符号可以包含单个/作为命名空间的分隔符。它还提到裸/是除法函数。
关于 clojure.core// 又如何呢?这仍然应该是一个易于阅读的符号吧?这是否是单斜杠 '/' 规则的一个例外吗?
foo.bar// 也会被阅读吗?foo//bar 呢?

0 票票

评论者: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" 的内容(以及让打印器打印这些)。

0 票票

评论者:alexmiller

我会说 :(以及 ::)是语法标记,规范描述了其后的字符。但我同意有必要对此进行更明确的说明。LispReader 中的(错误的)正则表达式也没有帮助。

标记字面量的想法是 | | 语法的一个有趣的替代方案,该语法被预留用于将来可能对没有效字符的关键字和符号的支持。但我认为这个想法超出了这个票据的范围,这个票据真正关于是要澄清规范。

0 票票

评论者:kunstmusik

虽然来得晚了,我在用户邮件列表

https://groups.google.com/forum/#!topic/clojure/CwZHu1Eszbk

提到了,当前 1 被允许作为符号名称的一部分,也就是说

(let (a# 4 b#a 3) (println a1. b#a))

将打印 "4 3"。

  1. 还用于自动生成符号,并在 https://clojure.org/reference/reader#syntax-quote 中作为符号名称的一部分进行了讨论。从邮件列表线程中可以看到,1. 被标记为“现在可能允许,但将来可能会更改”。我希望它能更清晰地描述为一个特例/保留,并要求限制读者中它的使用,以防止用户现在使用它,将来代码可能会出错。
0 票票
参考: https://clojure.atlassian.net/browse/CLJ-1527(由 bendlas 报告)
...