(defn make-adder [x]
(let [y x]
(fn [z] (+ y z))))
(def add2 (make-adder 2))
(add2 4)
-> 6
我试图在clojure中弄清楚这个例子。什么是y变量似乎永远不会被设置为任何东西。我不懂let语法。
答案 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?