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 映射时发现了这个关键字。

或许阅读器应该把该字符视为无效的符号字符抛出?或者,如果这个字符在随后版本中得到更详细的意义,向后兼容性可能被打破,是否存在这种风险?
by
有关为什么我们不进行验证见 https://clojure.org/guides/faq#unreadable_keywords。通过使用不在阅读器列表中的字符,你将进入未定义行为区域。
by
我好奇关于使用 `|` 作为这类分界 Symbols 的状态。这是否是在中短期内计划进行的事情?这将允许用 :abc/|123| 或类似的方式来读取 `:abc/123` 吗?
by
没有积极计划,但我们想保留空间。是的,这是个主意——当然,如果这么做,会有很多问题需要回答。这与 Common Lisp 的多个转义字符类似(https://www.lispworks.com/documentation/HyperSpec/Body/02_adea.htm)。
...