clojure不连续let

clojure不连续let,clojure,scheme,Clojure,Scheme,clojure的let似乎是连续的,并且与schemelet*相对应。 clojure是否有像scheme的let这样的非顺序绑定机制?我相信绑定宏是并行的,而不是顺序的 请参阅:letfn是函数的并行绑定形式,允许人们编写相互递归的局部函数。虽然它可以在必要时使用,但它并不像你所寻求的那样通用 user> (letfn [(a [] 4) (b [] c) (c [] a)] (a)) 4 只要将值分配给var

clojure的
let
似乎是连续的,并且与scheme
let*
相对应。
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))