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("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 报告)
...