gpt4 book ai didi

clojure - 步行/步行后使用

转载 作者:行者123 更新时间:2023-12-03 18:39:02 27 4
gpt4 key购买 nike

我正在通过这个 article on Tree Visitors in Clojure 并遇到以下示例:

(def data [[1 :foo] [2 [3 [4 "abc"]] 5]])

(walk/postwalk #(do (println "visiting:" %) %) data)

postwalk的外在形式是什么?我无法理解它的实用性。如何以及为什么使用 postwalk?任何解释将不胜感激。

最佳答案

我不确定您是在问 #() 是什么意思还是 do(form1 form2) 的目的是什么,所以我会同时回答两者。
#() 是声明匿名函数的简写。当您将某个函数传递给另一个函数时,匿名函数很有用。

为了说明,请看 repl

; define an anonymous function
user=> #(+ %1 %2)
#<user$eval68$fn__69 user$eval68$fn__69@9fe84e>

; is equivalent to
user => (fn [a b] (+ a b))
#<user$eval1951$fn__1952 user$eval1951$fn__1952@118bd3c>

; furthermore, you could then assign your anonymous function to a var
(def f #(+ %1 %2))

; is equivalent to
(defn f [a b] (+ a b))

user=> (#(+ %1 %2) 1 2)
3

user=> (f 1 2)
3
%n 指的是函数的位置参数的参数,其中 n 表示 nth 参数,从 1 开始作为进一步的简写,您可以使用 % 来指代第一个参数,该参数适用于单个 arg 匿名函数。这就是你在你的例子中所拥有的。

所以你的例子相当于
(def data [[1 :foo] [2 [3 [4 "abc"]] 5]])

(defn f [x] (do (println "visiting:" x) x))

(walk/postwalk f data)

这里的 do 是一种特殊形式,来自文档:

(do exprs*) Evaluates the expressions in order and returns the value of the last. If no expressions are supplied, returns nil.



事实上 defn 已经有一个隐含的 do,所以我上面的例子实际上并不需要 do...
; your example is equivalent to:

(def data [[1 :foo] [2 [3 [4 "abc"]] 5]])

(defn f [x] (println "visiting:" x) x)

(walk/postwalk f data)

关于clojure - 步行/步行后使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10594738/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com