fork download
  1. ; continuation passing style
  2.  
  3. (define (but-last xs)
  4. (reverse (cdr (reverse xs))))
  5.  
  6. (define (last xs) (car (reverse xs)))
  7.  
  8. (define (cps f)
  9. (lambda args
  10. (let ((f-args (but-last args)) (k (last args)))
  11. (k (apply f f-args)))))
  12.  
  13. (define (factorial n)
  14. (if (= n 0)
  15. 1
  16. (* n (factorial (- n 1)))))
  17.  
  18. (display (factorial 5)) (newline)
  19.  
  20. (define (factorial& n k)
  21. ((cps =) n 0 (lambda (b)
  22. (if b
  23. (k 1)
  24. ((cps -) n 1 (lambda (n-1)
  25. (factorial& n-1 (lambda (f)
  26. ((cps *) n f k)))))))))
  27.  
  28. (display (factorial& 5 (lambda (x) x))) (newline)
  29.  
  30. (define (fact n a)
  31. (if (= n 0)
  32. a
  33. (fact (- n 1) (* n a))))
  34.  
  35. (define (factorial n)
  36. (fact n 1))
  37.  
  38. (display (factorial 5)) (newline)
  39.  
  40. (define (fact& n a k)
  41. ((cps =) n 0 (lambda (b)
  42. (if b
  43. (k a)
  44. ((cps -) n 1 (lambda (n-1)
  45. ((cps *) n a (lambda (n*a)
  46. (fact& n-1 n*a k)))))))))
  47.  
  48. (define (factorial& n k)
  49. (fact& n 1 k))
  50.  
  51. (display (factorial& 5 (lambda (x) x))) (newline)
  52.  
  53. (define (pyth x y)
  54. (sqrt (+ (* x x) (* y y))))
  55.  
  56. (display (pyth 3 4)) (newline)
  57.  
  58. (define (pyth& x y k)
  59. ((cps *) x x (lambda (x2)
  60. ((cps *) y y (lambda (y2)
  61. ((cps +) x2 y2 (lambda (x2+y2)
  62. ((cps sqrt) x2+y2 k))))))))
  63.  
  64. (display (pyth& 3 4 (lambda (x) x))) (newline)
Success #stdin #stdout 0.04s 8808KB
stdin
Standard input is empty
stdout
120
120
120
120
5
5