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 %&
和号 - 就像在宏定义中的&form和&env那样
等于号 - clojure.core/=和其他许多函数
小于号 - clojure.core/< 和 clojure.core/<=
大于号 - clojure.core/> 和 clojure.core/>=

我不知道Clojure和edn规范在这一点上是否应该相同,但为了这个ticket提及这一点似乎值得。

0

评论者:jafingerhut

Alex,Rich在2011年对CLJ-17的评论:"出于性能原因,运行时验证已经取消。cemerick提出的任意符号支持使它们有效是个合理的建议,但任意符号支持是另一个ticket/idea。" 我不知道有任何ticket提出要增强Clojure,允许支持任意符号,例如通过像这样的语法

`

|这里的空白和任意#$@)$~)))@字符|

`

您认为为在符号和关键词中支持任意字符创建一个增强ticket是合理的吗?

0

评论者:alexmiller

当然。我对此了解一些,作为功能表达式的旁白,#|已经为潜在的使用而保留。然而,有许多棘手的问题,我不认为这会发生——更有可能是在为其他原因的必要推动时才进行。

0

评论者:bendlas

错误的ticket,但任何考虑在#|任意符号(或字符串)|中的人,请考虑将分隔符设置为可配置的,就像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问题)关于连续冒号的讨论。我想表达为什么连续冒号不被允许,并使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(link: "clojure.core" "/") 或 #kyw "1"(并将打印这些)。

0

评论者:alexmiller

我会说:(和 ::)是语法标记,规范描述了其后的字符。但我同意这将更明确。在 LispReader 中的(不正确的)正则表达式也不利于这一点。

标记字面量的想法是替代 | |语法的有趣替代品,它已预留供未来支持关键字和符号中的无效字符。但我认为这个想法超出了这个问题的范围,这个问题实际上是为了澄清规范。

0

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