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

欢迎!请访问关于页面以获取更多有关该功能的信息。

+2
语法和读取器

未指明的地方

  • 符号(及关键字)描述没有提到当前 Clojure 函数使用的组成字符,例如 <, >, =, $(Java 内部类的)、&(宏中的 &form 和 &env)、%(在 edn 规范中声明为有效)
  • 关键字当前接受开头的数字字符,这与规范相矛盾 - 请参见 CLJ-1286

参考资料

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

我想知道这个问答和相关的 Jira 任务是否已经过期,是否应该更新/关闭。

15 个答案

0

评论由:jafingerhut 提出

The Clojure reader documentation also does not mention the following symbols as valid constituent characters. They are all mentioned as valid symbol constituent characters in the EDN readme here: 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多部分分隔符的参考或示例,并说明为何你认为使用固定分隔符不是一个好主意?

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. 也用于自动生成符号并在https://clojure.org/reference/reader#syntax-quote中作为符号名称的一部分进行讨论。从邮件列表线程中,1. 被标注为“目前可能允许,但以后可能改变”。我希望能更清晰地描述为特殊情况/保留,并要求在读取器中限制其使用,以防止用户现在使用并可能导致代码以后出错。
0
参考: https://clojure.atlassian.net/browse/CLJ-1527(由bendlas报告)
...