为了找到一个不让我头疼的CPS的简单例子,我遇到了这个Scheme代码(Hand typed,所以parens可能不匹配):
(define fact-cps
(lambda(n k)
(cond
((zero? n) (k 1))
(else
(fact-cps (- n 1)
(lambda(v)
(k (* v n))))))))
(define fact
(lambda(n)
(fact-cps n (lambda(v)v)))) ;; (for giggles try (lambda(v)(* v 2)))
(fact 5) => 120
Run Code Online (Sandbox Code Playgroud)
很棒,但Scheme 并不是 Common Lisp,所以我对它进行了一次尝试:
(defun not-factorial-cps(n k v)
(declare (notinline not-factorial-cps)) ;; needed in clisp to show the trace
(cond
((zerop n) (k v))
((not-factorial-cps (1- n) ((lambda()(setq v (k (* v n))))) v))))
;; so not that simple...
(defun …Run Code Online (Sandbox Code Playgroud)