gpt4 book ai didi

clojure - 避免覆盖变量名

转载 作者:行者123 更新时间:2023-12-04 18:13:53 24 4
gpt4 key购买 nike

在我正在处理的特定命名空间上,我开始用完函数名称。如果我重用一个已经绑定(bind)到同一个命名空间中的函数的符号,是否有办法得到一个警告,就像我从另一个命名空间覆盖一个符号时得到的那样?

最佳答案

如果这足以成为您愿意替换(一组)核心宏的问题,您可以尝试这种方法:

(ns huge.core
(:refer-clojure :exclude [defn]))

(defmacro defn [name & defn-tail]
(assert (nil? (resolve name))
(str "Attempting to redefine already defined Var "
"#'" (.name *ns*) "/" name))
`(clojure.core/defn ~name ~@defn-tail))

然后尝试使用 defn 重新定义现有 Var将失败:
user=> (defn foo [] :foo)
#'user/foo
user=> (defn foo [] :bar)
AssertionError Assert failed: Attempting to redefine already defined Var #'user/foo
(nil? (resolve name)) user/defn (NO_SOURCE_FILE:2)

您可以类似地替换 defmacro ;在这种情况下,您必须调用 clojure.core/defmacro在定义自己的变体时。

朴实无华的 def是一种特殊的形式,并接受编译器的魔法处理,所以你仍然可以用它覆盖现有的 Vars。如果您也想防止该侧的名称冲突,您可以切换到类似 defvar (以前在 clojure.contrib.def 中可用)具有类似的自定义断言。

关于clojure - 避免覆盖变量名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7451007/

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