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,你能编辑我之前评论中链接的设计页面,添加一个关于如何配置 mime multipart 的分隔符的参考或例子吗?为什么你认为固定的分隔符不好呢?

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 读取器和 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("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. 也被用于auto-gensyms,并在https://clojure.org/reference/reader#syntax-quote中作为符号名称的一部分进行讨论。从邮件列表中,1.被标记为"现在可能允许,但以后可能会更改"。我希望它能更清楚地描述为特殊情况/保留,并请求限制其在阅读器中的使用,以防止用户现在使用它并在将来导致代码断裂。
0
参考:https://clojure.atlassian.net/browse/CLJ-1527(由bendlas报告)
...