sicp/mceval/common.rkt

48 lines
1.2 KiB
Racket
Raw Normal View History

2023-07-13 21:30:15 +00:00
#lang sicp
2023-08-12 22:12:09 +00:00
(#%require "syntax.rkt")
(#%provide apply-primitive-procedure
true?
false?
prompt-for-input
2023-07-26 21:27:06 +00:00
announce-output
2023-08-12 22:12:09 +00:00
user-print
2023-07-26 21:27:06 +00:00
eval-program)
2023-07-13 21:30:15 +00:00
(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))
2023-08-12 22:12:09 +00:00
(define (user-print object)
(cond ((compound-procedure? object)
(display (list 'compound-procedure
(procedure-parameters object)
(procedure-body object)
'<procedure-env>)))
(else (display object))))
2023-08-12 22:12:09 +00:00
2023-07-26 21:27:06 +00:00
;; 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))))))