-
-
Notifications
You must be signed in to change notification settings - Fork 2
/
Exercise_5_30.rkt
37 lines (31 loc) · 1.06 KB
/
Exercise_5_30.rkt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#lang racket/base
;; a:
(define (lookup-variable-value var env)
(travsersing-env
(lambda (env) (lookup-variable-value var (enclosing-environment env)))
(lambda (current-pair) (frame-unit-value current-pair))
(lambda (var) (list 'unbound-variable-error var)) ;; ***
env
var))
(define (unbound-error? val) ;; add it to eceval-operations
(tagged-list? val 'unbound-variable-error))
ev-variable
(assign val (op lookup-variable-value) (reg exp) (reg env))
(test (op unbound-error?) (reg val)) ;; ***
(branch (label signal-error))
(goto (reg continue))
;; b:
(define (apply-in-underlying-scheme proc args)
(with-handlers ([exn:fail:contract:divide-by-zero?
(lambda (exn) (list 'primitive-error exn))])
(apply proc args)))
(define (primitive-error? val) ;; add it to eceval-operations
(tagged-list? val 'primitive-error))
primitive-apply
(assign val (op apply-primitive-procedure)
(reg proc)
(reg argl))
(test (op primitive-error?) (reg val)) ;; ***
(branch (label signal-error))
(restore continue)
(goto (reg continue))