sicp/mceval/common.rkt

48 lines
1.2 KiB
Racket

#lang sicp
(#%require "syntax.rkt")
(#%provide apply-primitive-procedure
true?
false?
prompt-for-input
announce-output
user-print
eval-program)
(define (primitive-implementation proc) (cadr proc))
(define (apply-primitive-procedure proc args)
(apply
(primitive-implementation proc) args))
(define (true? x)
(not (eq? x false)))
(define (false? x)
(eq? x false))
(define (prompt-for-input string)
(newline) (newline) (display string) (newline))
(define (announce-output string)
(newline) (display string) (newline))
(define (user-print object)
(cond ((compound-procedure? object)
(display (list 'compound-procedure
(procedure-parameters object)
(procedure-body object)
'<procedure-env>)))
(else (display object))))
;; Program is a list of expressions to evaluate using the procedure
;; eval. user-print will be called to print any output.
(define (eval-program program eval user-print env)
(let loop ((prog program))
(if (null? (cdr prog))
(eval (car prog) env)
(begin
(eval (car prog) env)
(loop (cdr prog))))))