48 lines
1.2 KiB
Racket
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))))))
|