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 在 2011 年针对 CLJ-17 做了如下评论:“出于性能考虑,不在运行时进行验证。cemerick 的关于任意符号支持的提议是合理的,但任意符号支持是另一个项目/想法。” 我不知道有任何项目提议增强 Clojure 以支持任意符号,例如通过类似以下语法的

`

|空白和任意#$@)$~))@字符在此处|

`

您认为创建一个增强票项以支持符号和关键字中的任意字符是否合理?

0

评论者:alexmiller

当然。我曾就此进行了一些调查,因为我的一个启示是从特性表达式开始的,而且 #| 已经为此潜在用途保留了。然而,与此相关有许多棘手的问题,而且我不期望它在近期内会发生 - 更可能的情形是,当其他原因需要时,我们被迫这样做。

0

评论者:bendlas

这是个错误的票项,但对于任何考虑使用 #|任意符号(或字符串)| 的人,请考虑使其分隔符可配置,就像 mime 多部分一样。

0

评论者:jafingerhut

我目前创建了一个设计页面。我相信它并没有列出您找到的许多复杂问题。如果您愿意分享,我很乐意尝试记录它们。

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

0

评论者:jafingerhut

Herwig,您能否编辑我前一个评论中链接的设计页面,添加关于如何精确地说明MIME多部分如何配置分隔符的引用或示例,以及为什么您认为固定分隔符是一个坏主意?

0

评论者:bendlas

我在设计页面上发表了评论。

0

评论者:alexmiller

移除了几个已在阅读器页面上澄清的问题,这些问题不再是问题。

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 issue)我想解释为什么连续的冒号是不允许的,并同步Clojure Reader和EDN规范。

0

评论者:bendlas

更新的读取器规范规定,一个符号可以包含单个“/”来分隔命名空间。此外,它还提到裸“/”是除法函数。
那么clojure.core//又是什么情况呢?这仍然应该是一个易于阅读的符号,对吧?所以这是对“单个/”规则的例外吗?
foo.bar//也会是可读的符号吗?foo//bar又如何呢?

0

评论者: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"(并让打印机打印这些 )。

0

评论者:alexmiller

我会说::(以及 ::)是语法标记,规范描述了随后的字符。但我同意,最好对此做更明确的说明。LispReader 中的(不正确)正则表达式也有帮助。

标记字面值的概念是| |语法的有趣替代品,已为可能未来对关键字和符号中非法字符的支持而保留。但我认为这个想法超出了此票据的范围,这个票据实际上关于澄清规范。

0

评论者:kunstmusik

来晚了,我在用户邮件列表中的

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

提到,1.目前允许作为符号名称的一部分,所以

(let (link: 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 报告)
...