2024 年 Clojure 状态调查 中分享您的想法!

欢迎!请参阅 关于 页面了解有关此内容的更多信息。

+2
语法和读取器

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

  • 符号(和关键字)的描述未提及由 Clojure 函数 currently 正在使用的基本字符,如 <、>、=、$(Java 内部类)、&(宏中的 &form 和 &env)、%(edn 规范中声明为有效)
  • 关键字目前接受开头的数字字符,这与规范不符 -参阅 CLJ-1286

参考资料

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

我想知道这个问答和关联的 Jira 工单是否过时,是否应该更新/关闭。

15 个答复

0

评论者:jafingerhut

Clojure阅读器文档也没有提及以下符号作为合法组成部分。它们都被提及为EDN读取器的合法符号组成部分字符: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阅读器不接受包含连续冒号的符号和关键字(见链接:(link: https://github.com/clojure/clojure/commit/005ea1b5f96c5bb762e155032a865e29ad71bcf3#diff-3a5dca122734225f3f60263876401aebR275 文本:LispReader.java)),尽管当前EDN规范允许这样做。这里有关于连续冒号的一个(link: https://github.com/edn-format/edn/issues/68 文本:GitHub问题)。我想解释为什么连续冒号是不允许的,并使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
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. 也在auto-gensyms中使用,并在 https://clojure.org/reference/reader#syntax-quote 中作为符号名字符部分讨论。从邮件列表线程中可以看出,1. 被标记为“可能现在允许,但以后可能会改变”。我希望它更清楚地描述为特殊情况/保留,并要求将其限制在读取器中使用,以防止用户现在使用它并可能导致代码以后崩溃。
0
by
参考: https://clojure.atlassian.net/browse/CLJ-1527 (由 bendlas 报告)
...