gpt4 book ai didi

clojure - ^ :dynamic do in Clojure? 是什么意思

转载 作者:行者123 更新时间:2023-12-02 23:43:56 25 4
gpt4 key购买 nike

我在 google 上搜索了“clojure 动态”和“clojure 动态作用域”并阅读了 10 多篇文章,但我仍然没有清楚地了解 ^:dyanmic 的作用。 I think this article may be answering my question ,但代码示例似乎“丢失”,所以我什至不确定它是否指的是我感到困惑的同一件事。

我正在尝试解决 clj-http 中的问题项目,但首先我必须理解代码。它的函数定义如下:

(defn ^:dynamic parse-html
"Resolve and apply crouton's HTML parsing."
[& args]
{:pre [crouton-enabled?]}
(apply (ns-resolve (symbol "crouton.html") (symbol "parse")) args))

但我不明白 ^:dynamic 的含义/作用。谁能用非常简单的方式向我解释一下?

最佳答案

它将函数定义为动态作用域。

换句话说,这允许某人在给定的函数调用中重新绑定(bind) parse-html ,并使新的绑定(bind)仅应用于从该特定调用调用的函数。

如果 parse-html 不是动态作用域,那么重新绑定(bind)将导致新的绑定(bind)被使用 parse-html 的任何代码看到,而不仅仅是代码它是由执行重新绑定(bind)的函数调用激活的。

Dynamic scoping is useful as a substitute for globally scoped variables. A function can say "let current_numeric_base = 16; call other functions;" and the other functions will all print in hexadecimal. Then when they return, and the base-setting function returns, the base will return to whatever it was. http://c2.com/cgi/wiki?DynamicScoping

<小时/>

正如下面的评论所指出的,您实际上无法重新绑定(bind) Clojure 中未动态限定作用域的变量。如果可以的话,更新词法作用域的变量将影响所有执行的代码,即使它运行在与重新绑定(bind)发生位置不同的调用堆栈中。

所以也许一些伪代码会让动态作用域和词法作用域之间的区别变得清晰。

使用动态范围变量的示例:

(def ^:dynamic a 0)

(defn some-func [x] (+ x 1))

; re-binds a to 1 for everything in the callstack from the (binding)
; call and down
(binding [a 1]
(print (some-func a)))

; a was only re-bound for anything that was called from
; within binding (above) so at this point a is bound to 0.
(print (some-func a))

将打印:21

词法作用域变量的示例:

(def a 0)

(defn some-func [x] (+ x 1))

; re-binds a to 1 for everyone, not just things that
; are in the callstack created at this line
(set-var [a 1] ; set-var is a made up function that can re-bind lexically scoped variables
(print (some-func a)))

; a was lexically scoped so changing it changed
; it globally and not just for the callstack that
; contained the set-var.
(print (some-func a))

将打印:22

关于clojure - ^ :dynamic do in Clojure? 是什么意思,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15736960/

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