fact2.scm 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. ; Part of Scheme 48 1.9. See file COPYING for notices and license.
  2. ; Authors: Richard Kelsey
  3. (define (foo)
  4. (fact 10)
  5. (fact 20))
  6. (foo)
  7. (foo)
  8. (fact 5)
  9. (define *one* (unassigned))
  10. (define-local-syntax (define-primitive id nargs)
  11. (let ((args (reverse (list-tail '(z y x) (- '3 nargs)))))
  12. `(define (,id . ,args)
  13. (call-primitively ,id . ,args))))
  14. (define-local-syntax (define-effect-primitive id nargs)
  15. (let ((args (reverse (list-tail '(z y x) (- '3 nargs)))))
  16. `(define (,id . ,args)
  17. (call-primitively ,id . ,args)
  18. (call-primitively undefined-value))))
  19. (define-primitive + 2)
  20. (define-primitive - 2)
  21. (define-primitive * 2)
  22. (define-primitive < 2)
  23. ;(define-primitive quotient 2)
  24. ;(define-primitive remainder 2)
  25. (define-primitive char->ascii 1)
  26. (define-primitive ascii->char 1)
  27. (define-effect-primitive write-char 2)
  28. (define (unassigned) (call-primitively undefined-value))
  29. (define (byte-vector-ref vec index)
  30. (call-primitively byte-contents (ptr+ vec index)))
  31. (define (byte-vector-set! vec index value)
  32. (call-primitively byte-set-contents! (ptr+ vec index) value))
  33. (define (vector-set! vec index value)
  34. (call-primitively set-contents! (ptr+ vec (* index 4)) value))
  35. ;(write-number-no-newline 102 port)
  36. ;(define (write-number-no-newline x port)
  37. ; (let ((x (cond ((< x 0)
  38. ; (write-char '#\- port)
  39. ; (- 0 x))
  40. ; (else
  41. ; x))))
  42. ; (let loop ((x x) (mask foo))
  43. ; (let ((digit (quotient x mask)))
  44. ; (write-char (ascii->char (+ digit (char->ascii '#\0))) port)
  45. ; (if (< mask 1)
  46. ; (loop (remainder x mask) (quotient mask 10)))))))
  47. (define (fact n)
  48. (let loop ((i n) (r *one*))
  49. (if (<= *one* i)
  50. (loop (- i *one*) (* i r))
  51. r)))
  52. ;(define (poobah x)
  53. ; (+ x (* x (+ x (* x *two*)))))
  54. ;(define *two* 2)
  55. (define (<= x y)
  56. (not (< y x)))
  57. (define (not x)
  58. (if x #f #t))
  59. (define (identity x)
  60. x)
  61. (define (two x)
  62. 2)