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规范在这方面是否应该相同,但这对这个工单来说值得提及。

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 问题)关于连续冒号。我想说明为什么连续冒号不允许使用,并使 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. 它也用于自动生成 symp 和在 https://clojure.org/reference/reader#syntax-quote 中用作符号名的一部分。从邮件列表线程中可以看出,1. 被标记为 "现在可能允许,但以后可能会改变"。我希望能更明确地描述为特殊情况/保留的,并建议将它的使用限制在读取器中,以防止现在使用并可能导致代码将来出错。
0
参考:https://clojure.atlassian.net/browse/CLJ-1527 (由 bendlas 报告)
...