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

Cljs读取器的文档也没有提及其他符号作为有效的组成部分。它们在这里都被提及为有效的符号组成部分字符: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 读取器不接受连续冒号的符号和关键字(参见(链接: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 vs :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(link: "clojure.core" "/")或#kyw "1"(并且打印这些)。

0

评论由:alexmiller

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

标记字面量想法是有趣的替代方案,而不是| |语法,为关键字和符号中可能的未来支持非法字符而保留。但我认为这个想法超出了这个票据的范围,这个票据实际上是关于澄清规范的。

0

评论者:kunstmusik

来晚了,我在用户邮件列表中提到过

https://groups.google.com/forum/#!topic/clojure/CwZHu1Eszbk

1.目前可以作为符号名称的一部分,如下所示

(let (link: a#4 b#a3) (println a1.b#a))

将打印"4 3"。

  1. 也被用于自生成的符号,并在https://clojure.org/reference/reader#syntax-quote中进行讨论,作为符号名称的一部分。根据邮件列表讨论,1. 被标记为“现在可能允许,但以后可能会更改”。我希望它能更明确地描述为一个特殊案例/已保留的情况,并会提议将其在阅读器中的使用范围限制,以防止用户现在使用它,并可能在未来破坏代码。
0
参考:https://clojure.atlassian.net/browse/CLJ-1527(由bendlas报告)
...