试着去理解一个clojure“;让我们;例子
我试图在clojure中找出这个let示例。y变量是什么?它似乎从未设置为任何值。我不理解let语法试着去理解一个clojure“;让我们;例子,clojure,Clojure,我试图在clojure中找出这个let示例。y变量是什么?它似乎从未设置为任何值。我不理解let语法 (defn make-adder [x] (let [y x] (fn [z] (+ y z)))) (def add2 (make-adder 2)) (add2 4) -> 6 每个symN都绑定到相应的valN 此功能: (let [sym1 val1 sym2 val2 sym3 val3 ... ] <body>
(defn make-adder [x]
(let [y x]
(fn [z] (+ y z))))
(def add2 (make-adder 2))
(add2 4)
-> 6
每个symN
都绑定到相应的valN
此功能:
(let [sym1 val1
sym2 val2
sym3 val3
... ]
<body>)
(defn make-adder [x]
(fn [z] (+ x z)))
它本身返回一个(一个可以像任何其他值一样返回、传递和分配给名称的函数)。在let
中,x
绑定到y
,因此上面的函数相当于下面的函数:
(defn make-adder [x]
(let [y x]
(fn [z] (+ y z))))
因此,当使用值2
调用make adder
时,它返回此一级函数:
(let [sym1 val1
sym2 val2
sym3 val3
... ]
<body>)
(defn make-adder [x]
(fn [z] (+ x z)))
请记住,可以为名称指定一级函数,如下所示:
(fn [z] (+ 2 z))
因此,上述行相当于此代码:
(def add2 (made-adder 2))
因此,它也相当于该代码:
(def add2 (fn [z] (+ 2 z)))
这意味着调用add2
时:
(defn add2 [z] (+ 2 z))
上述表达式的计算结果如下:
(add2 4)
它的计算结果为
6
Let表达式在许多函数式编程语言中是标准的。
它将
y
绑定到x
。感谢你,现在有道理了。一个迂腐的观点,y不是一个变量,因为它的值永远不会变化。Clojure中有vars
,但它们很少在let绑定中使用(defn
这里创建了一个名为make adder
的var,而it和add2
是这里显示的唯一变量);“First class functions”下的最后一段代码有点挑剔:这里的命名有误导性,除非varN是var类型,否则没有varN是var。谢谢,这是我不知道的Lisp和Clojure之间的区别。我更新了我的答案,改为使用symN
。答案很好,很详细,但90%的答案与他的问题无关,而他的问题几乎是y
。没错。我想充分解释一下这个例子。谢谢你的回答。我之所以这样做是因为文档不是为我做的,虽然这里缺少let
解释,但这是对问题代码段中非let
内容的一个很好的解释。