(defn make-adder [x]
(let [y x]
(fn [z] (+ y z))))
(def add2 (make-adder 2))
(add2 4)
-> 6
Run Code Online (Sandbox Code Playgroud)
我试图在clojure中弄清楚这个例子.什么是y变量,似乎永远不会被设置为任何东西.我不懂let语法.
Bar*_*mar 17
(let [y x]
<body>)
Run Code Online (Sandbox Code Playgroud)
评估<body>在将词法上下文y被绑定到的值x.
有关语法的说明,请参阅Clojure 文档let.一般形式是:
(let [sym1 val1
sym2 val2
sym3 val3
... ]
<body>)
Run Code Online (Sandbox Code Playgroud)
每个symN都绑定到相应的valN.
djh*_*987 10
这个功能:
(defn make-adder [x]
(let [y x]
(fn [z] (+ y z))))
Run Code Online (Sandbox Code Playgroud)
它本身返回一个第一类函数(一个可以返回,传递并分配给名称的函数,就像任何其他值一样).里面let,x是绑定的y,所以上面的函数相当于下面这个函数:
(defn make-adder [x]
(fn [z] (+ x z)))
Run Code Online (Sandbox Code Playgroud)
因此,当make-adder使用该值调用时2,它将返回此第一类函数:
(fn [z] (+ 2 z))
Run Code Online (Sandbox Code Playgroud)
请记住,可以为名称分配第一类函数,如下所示:
(def add2 (made-adder 2))
Run Code Online (Sandbox Code Playgroud)
因此,上面的行等同于此代码:
(def add2 (fn [z] (+ 2 z)))
Run Code Online (Sandbox Code Playgroud)
所以也相当于这段代码:
(defn add2 [z] (+ 2 z))
Run Code Online (Sandbox Code Playgroud)
这意味着何时add2被召唤:
(add2 4)
Run Code Online (Sandbox Code Playgroud)
上面的表达式评估如下:
(+ 2 4)
Run Code Online (Sandbox Code Playgroud)
评估为6.
| 归档时间: |
|
| 查看次数: |
7115 次 |
| 最近记录: |