试图了解一个clojure“让”的例子

时间:2014-03-05 17:09:53

标签: clojure

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

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

3 个答案:

答案 0 :(得分:16)

(let [y x]
    <body>)

<body>绑定到y的值的词汇上下文中评估x

有关let语法的说明,请参阅Clojure documentation。一般形式是:

(let [sym1 val1
      sym2 val2
      sym3 val3
      ... ]
    <body>)

每个symN都绑定到相应的valN

答案 1 :(得分:10)

此功能:

(defn make-adder [x]
  (let [y x]
    (fn [z] (+ y z))))

它自己返回一个first-class function(一个可以返回,传递并分配给名称的函数,就像任何其他值一样)。在let内,x绑定到y,因此上面的函数等效于以下函数:

(defn make-adder [x]
  (fn [z] (+ x z)))

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

(fn [z] (+ 2 z))

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

(def add2 (made-adder 2))

上面的行等同于此代码:

(def add2 (fn [z] (+ 2 z)))

所以也相当于这段代码:

(defn add2 [z] (+ 2 z))

这意味着在调用add2时:

(add2 4)

上面的表达式评估为:

(+ 2 4)

评估为6

答案 2 :(得分:1)

让表达式成为许多函数式编程语言的标准。 What is the "let" keyword in functional languages like F# and OCaml for?