参与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 %&
Ampersand - 如在宏定义中的 &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

当然。我知道一些关于功能表达式的信息,但是 #| 已经 reserves for this potential use。然而,它有许多复杂的问题,我不认为它会很快发生 - 更可能是在需要时出于其他原因被迫采取的行动。

0
通过

评论者:bendlas

这是错误的票据,但请考虑为任意符号(或字符串)创建可配置的分隔符,就像在mime多部分中那样。

0
通过

由jafingerhut发表评论:

我目前已经创建了一个设计页面。我相信它没有列出您发现的许多复杂问题。如果您愿意共享笔记,我将很高兴尝试记录它们。

http://dev.clojure.org/pages/viewpage.action?pageId=11862058

0

由jafingerhut发表评论:

Herwig,您能否编辑我之前评论中链接的设计页面,添加一个参考或示例,精确说明如何配置MIMEmultipart的分隔符,以及为什么您认为固定的分隔符是个坏主意?

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 Reader和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

评论者: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 报告)
...