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 转换为 Keywordized Clojure Map 时出现了此问题。

也许读取器抛出此字符为无效的符号字符会更好?或者,如果在这之后的版本中此字符开始具有更复杂的含义,是否有打破向后兼容性的风险?
by
请参阅https://clojure.org/guides/faq#unreadable_keywords了解我们为什么不进行验证。使用不在读取列表中的字符会使你处于未定义行为区域。
by
我对使用 `|` 作为分隔命名符的这种情况表示好奇。这是否是短期内计划要做的事情?这将允许 `:abc/123` 被读取,例如,使用 `:abc/|123|` 或类似的方法吗?
by
目前没有积极规划,但我们希望留出空间。是的,这个想法——当然,如果我们这样做,会有很多问题需要回答。这都与 Common Lisp 多个转义字符相似(https://www.lispworks.com/documentation/HyperSpec/Body/02_adea.htm)。
...