2024 Clojure 状况调查!中分享你的想法。

欢迎!请参阅关于页面,了解有关此次活动的更多信息。

+2
语法和读取器

模糊指定的已知领域(https://clojure.org/reader#The Reader--Reader forms

  • 符号(以及关键字)描述未提及目前被 Clojure 函数使用的字符,例如 <、>、=、$(用于 Java 内部类)、&(宏中的 &form 和 &env)、%(在 edn 规范中声明为有效)
  • 关键字目前接受前导数字字符,这与规范不符 - see 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 发布

错误票据,但针对任何考虑#|任意符号或字符串|的人来说,请考虑使其定界符可配置,就像multipart 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和ED N规范同步。

0
by

评论由:bendlas 发布

更新后的读取器规范表明,一个符号可以包含一个斜杠来分隔命名空间。它还提到裸斜杠是除法函数。
那么clojure.core//是怎样的呢?这依然是一个可读的符号,对吗?这是否是对“单斜杠”规则的例外?
foo.bar//也会是可读的吗?foo//bar又是如何呢?

0
by

评论者: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
by

评论由:alexmiller 发布

我会说:(和::)是句法标记,规范描述了其后的字符。但我同意这应该更加明确。LispReader中的(不正确的)正则表达式也没有帮助。

标记字面量想法是对已被预留用于未来支持无效字符的关键词和符号的 | | 语法的一个有趣替代方案。但我觉得这个想法超出了此次工单的范围,这次工单的真正目的是阐明规范。

0
by

评论人: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
by
参考:https://clojure.atlassian.net/browse/CLJ-1527(由 bendlas 报告)
...