相关疑难解决方法(0)

clojure和^:动态

我试着理解动态变量和绑定函数,所以我尝试了这个(clojure 1.3):

user=> (defn f [] 
           (def ^:dynamic x 5) 
           (defn g [] (println x)) 
           (defn h [] (binding [x 3] (g))) 
           (h))
#'user/f
user=> (f)     
5
nil
Run Code Online (Sandbox Code Playgroud)

困惑,我尝试了这个稍微简单的代码:

user=> (def ^:dynamic y 5)
#'user/y
user=> (defn g [] (println y))
#'user/g
user=> (defn h [] (binding [y 3] (g)))
#'user/h
user=> (h)
3
nil
Run Code Online (Sandbox Code Playgroud)

这两段代码有什么区别?为什么第二个例子有效但第一个没有?

提示:我刚刚意识到以下工作(仍然不完全理解为什么):

user=> (def ^:dynamic y 5)
#'user/y
user=> (defn f [] (defn g [] (println y)) (defn h [] (binding [y 3] (g))) (h)) …
Run Code Online (Sandbox Code Playgroud)

clojure dynamic-scope

26
推荐指数
1
解决办法
1万
查看次数

Clojure动态绑定

我发现以下是一个坏主意,原因很多.我也意识到,鉴于我有一个23的stackoverflow代表,它的本质是假设我是一个新手学习编程.但是,请幽默我,并专注于"我们怎么做",而不是"你为什么要这样做/你不想这样做"的方面.

我想要的是:

(def dog (Dog. ...))
(def cat (Cat. ...))

(with-animal dog
  (println (str "Dog: " (speak) "\n")))
(with-animal cat
  (println (str "Cat: " (speak) "\n")))
Run Code Online (Sandbox Code Playgroud)

输出:

Dog: woof
Cat: meow
Run Code Online (Sandbox Code Playgroud)

所以基本上,我希望with-animal是一个宏,所有出现的"speak"函数调用都会被映射到我正在调用块的对象.

特别是,我不想写:

(let-binding [speak (fn [] "woof")] ...)
(let-binding [speak (fn [] "meow")] ...)
Run Code Online (Sandbox Code Playgroud)

相反,我希望with-animal将speak函数映射到我正在调用的对象的某个方法.

在Clojure中有一个干净的方法吗?

谢谢!

clojure dynamic-scope

8
推荐指数
1
解决办法
2804
查看次数

标签 统计

clojure ×2

dynamic-scope ×2