gpt4 book ai didi

namespaces - clojure 关键字什么时候应该出现在命名空间中?

转载 作者:行者123 更新时间:2023-12-03 08:57:32 25 4
gpt4 key购买 nike

在 clojure 中,关键字对自身进行评估,例如:

>>:test
:test

它们不接受任何参数,也不受任何约束。那么,为什么我们需要限定命名空间中的关键字?

我知道创建 isa使用 derive 的层次结构需要命名空间限定关键字(例如 ::test )。是否有任何其他情况明确需要在命名空间中使用关键字?

最佳答案

如果任何代码有机会在命名空间上下文之外与关键字交互,则应该对关键字进行命名空间限定。我能想到的主要示例是两个命名空间,将键和值放入第三个命名空间中的哈希映射中,其中键是关键字(因为它们通常在 Clojure 中)。一个人为的例子:

user> (ns main)
nil
main> (def DATA (ref {}))
#'main/DATA
main> (ns foo)
nil
foo> (dosync (alter main/DATA assoc :bad 123 ::good 123))
{:foo/good 123, :bad 123}
foo> main/DATA
#<Ref@541b02: {:foo/good 123, :bad 123}>
foo> (ns bar)
nil
bar> (dosync (alter main/DATA assoc :bad 456 ::good 456))
{:bar/good 456, :foo/good 123, :bad 456} ;; oops, no more :bad from foo

你为什么想做这个?好吧,Clojure 中的一些核心概念(例如 derive )就是这样实现的,作为 clojure.core 中的哈希映射。多方法也经常根据关键字值进行调度,并且命名空间为另一个命名空间中的多方法定义方法的情况并不少见。不难想到图书馆的作者可能希望提供类似机制的情况。

如果您的关键字有任何逃离您的 namespace 的风险,那么最好对您的关键字进行 namespace 限定,除非您特别希望您的关键字破坏来自其他 namespace 的关键字。

关于namespaces - clojure 关键字什么时候应该出现在命名空间中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2481984/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com