12

これは、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]は、最初にnkendで呼び出されます
  • 継続関数cont [v]は ( vを指定したkontの部分適用でkを呼び出す) として定義され、最初のパラメーターとして、 nが 2 番目のパラメーターとして定義されます。なぜこれは単に ではなく を使用して書かれるのでしょうか?partial(k (cont v n))
  • 関数が合格した場合、 1accept?に適用して再帰を終了しますk
  • それ以外の場合、デクリメントされた n と継続関数を使用してfn [nk]recurに戻ります。
  • 全体を通して、kontは変化しません。

k決勝まで実際に実行されないのは正しい(k 1)ですか?したがって、評価される前に(fac 3)最初に展開されます。(* 1 (* 2 3))

4

1 に答える 1