;; Seasoned scheme stuff ;; To match the examples in The Seasoned Schemer, I'm calling let/cc ;; as letcc. Easier to type, too. ;; letcc takes the name of a single continuation variable 'k' and the ;; rest of the expressions (e ...). (define-syntax letcc (syntax-rules () ((letcc k e ...) (let/cc k e ...)))) ;; FIXME: how do we guarantee that k is a symbol? ;; Single variable version of let --- less parentheses (define-syntax let1 (syntax-rules () ((let1 (k v) e ...) (let ((k v)) e ...)))) ;; Single variable version of letrec --- less parentheses (define-syntax letrec1 (syntax-rules () ((letrec1 (k v) e ...) (letrec ((k v)) e ...)))) ;; Iteration for running across lists. (define-syntax dolist (syntax-rules () ((dolist (k l) e ...) (let loop ((somelist l)) (if (null? somelist) (void) (let ((k (car somelist))) e ... (loop (cdr somelist)))))))) (define sum-of-prefixes (lambda (lon) (if (null? lon) (quote ()) (sum-of-prefixes-b 0 lon)))) (define sum-of-prefixes-b (lambda (sum-so-far lon) (if (null? lon) (quote ()) (cons (+ sum-so-far (car lon)) (sum-of-prefixes-b (+ sum-so-far (car lon)) (cdr lon)))))) (define sum-of-prefixes (letrec ((sum-of-prefixes-b (lambda (sum-so-far lon) (if (null? lon) (quote ()) (cons (+ sum-so-far (car lon)) (sum-of-prefixes-b (+ sum-so-far (car lon)) (cdr lon))))))) (lambda (lon) (if (null? lon) (quote ()) (sum-of-prefixes-b 0 lon))))) (define rember-upto-last (lambda (a lat) (let/cc skip (letrec ((R (lambda (lat) (cond ((null? lat) (quote ())) ((eq? (car lat) a) (skip (R (cdr lat)))) (else (cons (car lat) (R (cdr lat)))))))) (R lat)))))