gpt4 book ai didi

binding - 使用 Clojure 在运行时动态绑定(bind)函数

转载 作者:行者123 更新时间:2023-12-04 03:35:28 26 4
gpt4 key购买 nike

我今天开始使用 Clojure,偶然发现可以在运行时动态更改函数的说法。
这听起来很酷,所以我使用此功能编写了一小段代码。

(defn ^:dynamic state [x]
(odd x))

(defn even [x]
(if (= x 0)
(println "even")
(binding [state odd] (parity x))))

(defn odd [x]
(if (= x 0)
(println "odd")
(binding [state even](parity x))))

(defn parity [x]
(state (dec x)))

效果很好,但是由于我对 Clojure 完全陌生,所以我不知道这是否是
a)干净的功能代码(因为奇怪甚至似乎有副作用?)
b)应该在运行时更改功能的方式

我将不胜感激任何建议! :)
-扎库姆

最佳答案

虽然能够将符号动态绑定(bind)到不同的函数,但我猜你想要的是真正重新定义一个函数。

可以这样想:您的代码创建了一个符号和两个函数,并且您将符号动态绑定(bind)到不同的函数:

                                   +---> func1
/
symbol ---- [dynamic binding] ---<
\
+---> func2

您的动态绑定(bind)的效果仅限于 binding 的范围。调用。

我们想要实现的是,给定一个符号和一个函数,为该函数提供一个新的实现,以便所有引用它的代码都可以访问新的实现:
(defn func1 [...])

(var func1) ; ---> func1

(defn func1 [...])

(var func1) ; ---> func1*

并且这样的更改会永久影响所有使用 func1 的代码.当您开发 clojure 时,这是一项正常的任务:您很可能会在正在运行的应用程序上打开一个 REPL,并且您将 defdefn一遍又一遍地重复相同的符号,重新定义应用程序的所有移动部分。

如果您使用 Emacs 和 SLIME/Swank,请随时点击 C-c C-k在修改后的 Clojure 源文件中,您可能会重新定义命名空间中的所有函数,而无需重新启动应用程序。

关于binding - 使用 Clojure 在运行时动态绑定(bind)函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8342987/

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