clojure不连续let
clojure的clojure不连续let,clojure,scheme,Clojure,Scheme,clojure的let似乎是连续的,并且与schemelet*相对应。 clojure是否有像scheme的let这样的非顺序绑定机制?我相信绑定宏是并行的,而不是顺序的 请参阅:letfn是函数的并行绑定形式,允许人们编写相互递归的局部函数。虽然它可以在必要时使用,但它并不像你所寻求的那样通用 user> (letfn [(a [] 4) (b [] c) (c [] a)] (a)) 4 只要将值分配给var
let
似乎是连续的,并且与schemelet*
相对应。
clojure是否有像scheme的
let
这样的非顺序绑定机制?我相信绑定
宏是并行的,而不是顺序的
请参阅:letfn是函数的并行绑定形式,允许人们编写相互递归的局部函数。虽然它可以在必要时使用,但它并不像你所寻求的那样通用
user> (letfn [(a [] 4)
(b [] c)
(c [] a)]
(a))
4
只要将值分配给vars中的内容并希望动态范围,就可以使用绑定
user> (def ^:dynamic x 4)
#'user/x
user> (defn foo [] x)
#'user/foo
user> (binding [x 8] (+ x (foo)))
16 ; the value of x that gets called by foo is modified by the caller
; yielding 16 instead of 12
user> (binding [x 8 a 7] (+ x (foo)))
; Evaluation aborted.
Unable to resolve var: a in this context
如果您尝试使用并行绑定,动态作用域将给出与Scheme中let*不同的结果
user> (def ^:dynamic a 2)
#'user/a
user> (binding [x 8 a 7] (+ x a))
15
user> (binding [x 8 a (+ x 2)] (+ x a))
14 ; this would be 18 if the binding of x to 8 had been used
; instead the root value of 4 was used.
一般来说,如果需要,最常见的是按顺序绑定或使用嵌套的
let
s。绑定与并行的let
没有相同的功能,因为它取决于绑定的存在。如前所述,letfn
只要您不介意将值包装到函数中,就可以工作。另一种解决方案是使用宏编写并行let:
(defmacro letp
[bindings & exprs]
(let [bindings (partition 2 bindings)
vars (->> bindings (map first) vec)
values (->> bindings (map second))]
`((fn ~vars ~@exprs)
~@values)))
因此,以下观点成立:
(def a 7)
(letp [a 5 b a] b)
;;=> 7
谢谢(defn测试[](绑定[A0B(+A1)]b))