This repository has been archived on 2022-08-10. You can view files and clone it, but cannot push or open issues or pull requests.
chez-openbsd/ta6ob/examples/scons.ss

42 lines
1.1 KiB
Scheme
Raw Normal View History

2022-08-09 23:28:25 +02:00
;;; scons.ss
;;; a stream-construction facility
;;; The scons special form performs a cons, suspending the cdr field
;;; by enclosing it in a procedure of no arguments. scdr tests to see
;;; if the cdr is a procedure, and if so, invokes it. scar is provided
;;; for symmetry; it is just car.
;;; The function stream-ref is simply list-ref defined in terms of
;;; scdr and scar.
;;; factlist and fiblist are two infinite streams.
;;; Try (stream-ref factlist 10) or (stream-ref fiblist 20).
;;; scons could easily suspend the car field as well. This would
;;; implement the lazy cons of Friedman & Wise.
(define-syntax scons
(syntax-rules ()
((_ car cdr) (cons car (lambda () cdr)))))
(define scar car)
(define scdr
(lambda (x)
(when (procedure? (cdr x)) (set-cdr! x ((cdr x))))
(cdr x)))
(define stream-ref
(lambda (x n)
(if (zero? n)
(scar x)
(stream-ref (scdr x) (1- n)))))
(define factlist
(let fact ([a 1] [n 1])
(scons a (fact (* a n) (1+ n)))))
(define fiblist
(let fib ([fib-2 0] [fib-1 1])
(scons fib-1 (fib fib-1 (+ fib-2 fib-1)))))