2024 年 Clojure 状态调查! 中分享您的想法。

欢迎!请参阅 关于 页面以了解更多关于该网站的信息。

+1
Clojure

你好,

在 clj 和 cljs 中,管道字符 `|` 被视为符号组成部分字符

user> {:one|two 'three|four}
{:one|two three|four}

cljs.user> {:one|two 'three|four}
{:one|two three|four}

尽管它在官方资料中没有明确提到

https://clojure.org/reference/reader#_symbols
https://github.com/edn-format/edn#symbols

由于阅读器接受它作为符号组成部分,我们可以假定它是一个有效的符号组成部分字符吗?

谢谢

1 个答案

+3

你不应该使用 `|`,因为它被保留用于可能的分隔命名。

具体来说,类似 `:one|two 'three|four` 的东西将来实际上可能被阅读为一个包含空格和引号的单一关键字。

谢谢,我会在将 Java HashMap 转换为关键词化的 Clojure Map 时遇到这个问题。

也许让读者将这个字符当作无效字符来抛出会更好?或者,如果这个字符在未来的版本中开始具有更复杂的含义,后退兼容性是否会受到影响存在风险吗?
请参阅https://clojure.org/guides/faq#unreadable_keywords 了解我们为何不进行验证。通过使用不在读取列表上的字符,你将进入未定义行为领域。
我对使用`|`作为类似命名分界的状态感到好奇。这是否是中期计划中的内容?这将允许使用:abc/123之类的模式读取,比如:abc/|123|吗?
这不是积极筹划的内容,但我们希望为其留出空间。是的,这就是想法——当然,如果我们这么做,还有很多问题需要解答。这与Common Lisp的多重转义字符类似(https://www.lispworks.com/documentation/HyperSpec/Body/02_adea.htm)。
...