pro*_*eek 0 macros clojure operators
Clojure的->>宏线程从最后一个参数的形式,从第一个->形式开始.
user=> (->> a (+ 5) (let [a 5]))
10
Run Code Online (Sandbox Code Playgroud)
但是,当我使用交换的操作时,我得到一个例外.
user=> (-> a (let [a 5]) (+ 5))
CompilerException java.lang.IllegalArgumentException: let requires a vector for its binding in user:1, compiling:(NO_SOURCE_PATH:1:7)
Run Code Online (Sandbox Code Playgroud)
此外,我希望这两个操作能得到相同的结果,但事实并非如此.
user=> (-> 0 (Math/cos) (Math/sin))
0.8414709848078965
user=> (->> 0 (Math/sin) (Math/cos))
1.0
Run Code Online (Sandbox Code Playgroud)
怎么了?怎么->和->>宏一起工作?
该->宏插入参数作为给定功能,不给说法到最后一个函数的第一个参数.同样->>插入作为最后一个参数.
user=> (macroexpand '(-> x (- 1)))
(- x 1)
user=> (macroexpand '(->> x (- 1)))
(- 1 x)
Run Code Online (Sandbox Code Playgroud)
两个简单的例子:
user=> (-> 1 (- 1) (- 2))
-2
user=> (->> 1 (- 1) (- 2))
2
Run Code Online (Sandbox Code Playgroud)
至于第一个例子-2 == (- (- 1 1) 2),和第二个例子2 == (- 2 (-1 1))
结果,我们得到了一元函数的相同结果.
user=> (macroexpand '(-> 0 Math/sin Math/cos))
(. Math cos (clojure.core/-> 0 Math/sin))
user=> (macroexpand '(->> 0 Math/sin Math/cos))
(. Math cos (clojure.core/->> 0 Math/sin))
Run Code Online (Sandbox Code Playgroud)
所以,只->>在问题中有意义.
user=> (macroexpand '(->> a (+ 5) (let [a 5])))
(let* [a 5] (clojure.core/->> a (+ 5)))
user=> (macroexpand '(-> a (+ 5) (let [a 5])))
IllegalArgumentException let requires a vector for its binding in user:1 clojure.core/let (core.clj:4043)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
115 次 |
| 最近记录: |