试图了解一个clojure"让"的例子

eat*_*mon 12 clojure

(defn make-adder [x]
  (let [y x]
    (fn [z] (+ y z))))
(def add2 (make-adder 2))
(add2 4)
-> 6
Run Code Online (Sandbox Code Playgroud)

我试图在clojure中弄清楚这个例子.什么是y变量,似乎永远不会被设置为任何东西.我不懂let语法.

Bar*_*mar 17

(let [y x]
    <body>)
Run Code Online (Sandbox Code Playgroud)

评估<body>在将词法上下文y被绑定到的值x.

有关语法的说明,请参阅Clojure 文档let.一般形式是:

(let [sym1 val1
      sym2 val2
      sym3 val3
      ... ]
    <body>)
Run Code Online (Sandbox Code Playgroud)

每个symN都绑定到相应的valN.


djh*_*987 10

这个功能:

(defn make-adder [x]
  (let [y x]
    (fn [z] (+ y z))))
Run Code Online (Sandbox Code Playgroud)

它本身返回一个第一类函数(一个可以返回,传递并分配给名称的函数,就像任何其他值一样).里面let,x是绑定的y,所以上面的函数相当于下面这个函数:

(defn make-adder [x]
  (fn [z] (+ x z)))
Run Code Online (Sandbox Code Playgroud)

因此,当make-adder使用该值调用时2,它将返回此第一类函数:

(fn [z] (+ 2 z))
Run Code Online (Sandbox Code Playgroud)

请记住,可以为名称分配第一类函数,如下所示:

(def add2 (made-adder 2))
Run Code Online (Sandbox Code Playgroud)

因此,上面的行等同于此代码:

(def add2 (fn [z] (+ 2 z)))
Run Code Online (Sandbox Code Playgroud)

所以也相当于这段代码:

(defn add2 [z] (+ 2 z))
Run Code Online (Sandbox Code Playgroud)

这意味着何时add2被召唤:

(add2 4)
Run Code Online (Sandbox Code Playgroud)

上面的表达式评估如下:

(+ 2 4)
Run Code Online (Sandbox Code Playgroud)

评估为6.