首页 > clojure编程 中函数sync-fn的语义怎么理解?

clojure编程 中函数sync-fn的语义怎么理解?

(defn sync-fn
    [async-fn]
    (fn [& args]
        (let [result (promise)]
            (apply async-fn (conj (vec args) #(deliver result %&)))
        @result)))

这个是clojure编程p165页的一个包装回调函数的高阶函数。我看不懂这个函数定义的参数,和实参是如何对应起来的。
let 代表参数的解构,[result (promise)]的result值得获取依赖于#(deliver result %&)函数取得实参,result从字面的意思是一个函数的返回值。那么%& 这个参数是从哪个实参里面获取值得呢?
sync-fn通过传入一个函数async-fn创建了一个匿名函数。但是为什么把async-fn函数的返回值也作为参数传给async-fn函数。


是这样的, 符号%在匿名函数中,代表了参数,比如 %1 代表第一个参数, %2 第二个参数, %& 代表剩下的参数,由于 #(deliver result %&) 中没有其它的参数,这个匿名函数会把所有的参数,传递给 result。

但是为什么把async-fn函数的返回值也作为参数传给async-fn函数。

这里没有把async-fn函数的返回值传给async-fn函数,只是把一个匿名函数(这是一个callback,参考书上的代码),作为最后一个参数,传给 async-fn,由 async-fn 负责最后调用。

【热门文章】
【热门文章】