[comp.lang.scheme] SICP in Scheme->C

jwb@cepmax.ncsu.EDU (John W. Baugh Jr.) (09/27/90)

In trying to get some of the SICP code running in Scheme->C,
I used the following definitions and macros, which (presumably
help to) convert MIT Scheme code into R3RS.  I don't claim to
be an expert in either dialect (or in Scheme in general for
that matter), so if any of you have comments I'd gladly
entertain them.

John Baugh
jwb@cepmax.ncsu.edu


;;; Some MIT Scheme Extensions/Changes to Scheme->C

; Note: you should
;   replace (1+ x) with (+ x 1) since 1+ cannot be parsed
;   replace (eval exp env) with (eval exp)

(define nil '())
(define t #t)
(define (atom? x) (not (pair? x)))
(define princ display)
(define (print expression)
  (newline)
  (write expression))

(define-macro sequence
  (lambda (form expander)
    (expander
     `(begin ,@(cdr form))
     expander)))
     
(define r3rs-assoc assoc)
(define (assoc obj alist)
  (or (r3rs-assoc obj alist) '()))
(define r3rs-assq assq)
(define (assq obj alist)
  (or (r3rs-assq obj alist) '()))
(define r3rs-assv assv)
(define (assv obj alist)
  (or (r3rs-assv obj alist) '()))
     
(define r3rs-member member)
(define (member expression list)
  (or (r3rs-member expression list) '()))
(define r3rs-memq memq)
(define (memq expression list)
  (or (r3rs-memq expression list) '()))
(define r3rs-memv memv)
(define (memv expression list)
  (or (r3rs-memv expression list) '()))
     
(define r3rs-not not)
(define (not expression)
  (or (r3rs-not expression) '()))

(define (char->string c)
  (make-string 1 c))
(define (char->symbol c)
  (string->symbol (char->string c)))
(define (symbol->char s)
  (string-ref (symbol->string s) 0))
(define (explode symbol)
  (map char->symbol (string->list (symbol->string symbol))))
(define (implode list-of-symbols)
  (string->symbol (list->string (map symbol->char list-of-symbols))))

(define put putprop)
(define (get symbol expression)
  (or (getprop symbol expression) '()))

(define cons-stream cons)
(define singleton list)
(define head car)
(define tail cdr)
(define the-empty-stream '())
(define empty-stream? null?)
(define append-streams append)
(define (accumulate combiner initial-value stream)
  (if (empty-stream? stream)
      initial-value
      (combiner (head stream)
		(accumulate combiner
			    initial-value
			    (tail stream)))))
(define (flatten stream)
  (accumulate append-streams the-empty-stream stream))
(define (flatmap f s)
  (flatten (map f s)))
(define (interleave-delayed s1 delayed-s2)
  (if (empty-stream? s1)
      (force delayed-s2)
      (cons-stream (head s1)
                   (interleave-delayed (force delayed-s2)
                                       (delay (tail s1))))))