これは、Joy of Clojure、第 2 版からのものです。http://www.manning.com/fogus2/
(defn mk-cps [accept? kend kont]
(fn [n]
((fn [n k]
(let [cont (fn [v] (k ((partial kont v) n)))]
(if (accept? n)
(k 1)
(recur (dec n) cont))))
n kend)))
次に、階乗を作成します。
(def fac (mk-cps zero? identity #(* %1 %2)))
私の理解:
- mm-cps は、fn [n] nを受け取る関数を生成します。
- 内部の関数fn [nk]は、最初にnとkendで呼び出されます
- 継続関数cont [v]は ( vを指定したkontの部分適用でkを呼び出す) として定義され、最初のパラメーターとして、 nが 2 番目のパラメーターとして定義されます。なぜこれは単に ではなく を使用して書かれるのでしょうか?
partial
(k (cont v n))
- 関数が合格した場合、 1
accept?
に適用して再帰を終了しますk
。 - それ以外の場合、デクリメントされた n と継続関数を使用してfn [nk]
recur
に戻ります。 - 全体を通して、kontは変化しません。
k
決勝まで実際に実行されないのは正しい(k 1)
ですか?したがって、評価される前に(fac 3)
最初に展開されます。(* 1 (* 2 3))