请在 2024 年 Clojure 状况调查中分享您的想法!

欢迎!请参阅关于页面以了解该网站的更多详情。

+2
语法和读取器

已知的不明确领域(https://clojure.org/reader#The%20Reader--Reader%20forms

  • 符号(和关键字)描述没有提及 Clojure 函数目前使用的一些字符,比如 <、>、=、$(Java 内部类使用),&(&form 和 &env 在宏中),%(在 edn 规范中声明为有效)
  • 关键字当前接受前导数字字符,这与规范不符 - 参见 CLJ-1286

参考文献

粗略查看当前页面(指南:https://clojure.org/guides/weird_characters 和参考:https://clojure.org/reference/reader),似乎这些问题已被解决,但并非全部。

我想问一下这个提问和相关的 Jira 问题票是否过时,是否应该更新或关闭。

15 答案

0

评论者:jafingerhut

Clojure 读取器文档也没有提到以下符号作为有效成分字符。在这里的所有符号成分字符都被列为有效的符号成分字符:[链接](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 multipart。

0

评论者:jafingerhut

我已经创建了一个设计页面。我相信它并没有列出您发现的所有棘手问题。如果您愿意分享任何笔记,我将很乐意尝试记录它们。

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

0

评论者:jafingerhut

Herwig,你能编辑我在之前的评论中提到的设计页面,添加一个参考或示例来说明如何准确地配置下行符,以及你为什么认为使用固定下行符是个糟糕的想法吗?

0

评论者:bendlas

我在设计页面上做了评论。

0

评论者:alexmiller

删除了一个已在阅读器页面上澄清的问题,该问题不再成问题。

0

评论者:bronsa

相关于CLJ-1530

0

评论者:adamfrey

与以下相关:Clojure阅读器不会接受包含连续冒号的符号和关键词(见(链接:[LispReader.java](https://github.com/clojure/clojure/commit/005ea1b5f96c5bb762e155032a865e29ad71bcf3#diff-3a5dca122734225f3f60263876401aebR275)),尽管当前的EDN规范允许这样做。以下是关于连续冒号的(链接:[GitHub issue](https://github.com/edn-format/edn/issues/68))。我想说明为什么禁止连续冒号,并使Clojure阅读器和EDN规范同步。

0

评论者:bendlas

更新的读取器规范指出,一个符号可以包含单个“/”来分隔命名空间。它也提到一个裸露的“/”用作除法函数。
那么clojure.core//呢?难道它仍然是一个可读的符号吗?那么这是否是“单个/”规则的例外呢?
foo.bar//是否也会是可读的?那么foo//bar呢?

0

评论者: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"(而打印器则打印这些)。

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](https://clojure.atlassian.net/browse/CLJ-1527)(由bendlas报告)
...