Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
试着去理解一个clojure“;让我们;例子_Clojure - Fatal编程技术网

试着去理解一个clojure“;让我们;例子

试着去理解一个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>

我试图在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]
  (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
内容的一个很好的解释。