(defn make-adder [x]
(let [y x]
(fn [z] (+ y z))))
(def add2 (make-adder 2))
(add2 4)
-> 6
我正在尝试理解Clojure中的let示例。变量y是什么,它似乎从未被设置为任何值。我不理解let语法。
(defn make-adder [x]
(let [y x]
(fn [z] (+ y z))))
(def add2 (make-adder 2))
(add2 4)
-> 6
我正在尝试理解Clojure中的let示例。变量y是什么,它似乎从未被设置为任何值。我不理解let语法。
(let [y x]
<body>)
在一个词法环境中,y
被绑定到x
的值,评估<body>
。
有关let
语法,请参见Clojure文档。其一般形式为:
(let [sym1 val1
sym2 val2
sym3 val3
... ]
<body>)
每个 symN
都绑定到相应的 valN
。
symN
代替。 - Barmar这个函数:
(defn make-adder [x]
(let [y x]
(fn [z] (+ y z))))
它本身返回一个一等函数(一个像任何其他值一样可以返回、传递和分配名称的函数)。在let
内部,x
绑定到y
,因此上面的函数等效于下面的函数:
(defn make-adder [x]
(fn [z] (+ x z)))
因此,当调用具有值2
的make-adder
时,它将返回此一等函数:
(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
。
y
。 - Barmarlet
解释有所欠缺,但这是对问题中代码片段中非let
部分的很好的解释。 - alichaudry
y
绑定到x
。 - Barmar