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.md 中被提及为有效的符号组成部分字符:[查看详情](https://github.com/edn-format/edn#symbols)

美元符号 - 在 Clojure/JVM 中用于区分子类名和类名,例如: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 的评论中,Rich这样说:"出于性能考虑,不再进行运行时验证。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 问题)。我想说明为什么连续冒号是不允许的,并使 Clojure 读取器和 EDN 规范在这一问题上一致。

0

评论者:bendlas

更新的读者规范指出,一个符号可以包含一个 / 来分隔命名空间。它还提到裸 / 是除法函数。
那么clojure.core//怎么样呢?这仍然应该是一个可读的符号,对吧?这难道不是“单/”规则的例外吗?
foo.bar//也会是可读的吗?那么foo//bar呢?

0

评论者:favila

我发现另一个歧义来源在于,关键字的第一冒号是否是关键字(因此也是符号)的第一个字符,或者它是否是特殊字符,规范实际上描述了从第二个字符开始的情况。这很重要,因为关键字的规范在edn和reader规范中都是以与符号的区别来给出的。我认为许多奇怪的关键字边缘情况(包括:1与:a/1的合法性)都源于这种歧义,不同的ticket/patches似乎是选择了其中一种基本假设。请参阅(链接: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中的(不正确的)正则表达式也不太有帮助。

标记字面量的想法是| |语法的有趣替代品,为关键字和符号可能在未来支持非法字符预留了。但我认为这个想法不属于这个ticket的范围,这个ticket真正关注的是澄清规范。

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. 也用于自动生成符号(auto-gensyms)并讨论于https://clojure.org/reference/reader#syntax-quote作为符号名称的一部分。从邮件列表主题来看,1.可能现在是被允许的,但将来可能会改变。如果它更清楚地描述为特殊情况/保留,我将请求限制其在reader中的使用,以防止用户现在使用它,并可能使代码在未来崩溃。
0
by
参考:https://clojure.atlassian.net/browse/CLJ-1527(由bendlas报告)
...