-
Notifications
You must be signed in to change notification settings - Fork 1
/
rtdata.scm
123 lines (92 loc) · 3.31 KB
/
rtdata.scm
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
;;; -*- Mode:Scheme -*-
(declare (usual-integrations))
(define the-unspecified-value (list 'the-unspecified-value))
;;; Primitive procedures (inherited from Scheme)
(define primitive-procedure? procedure?)
;;; Compound procedures
(define-record-type <compound-procedure>
(make-compound-procedure vars bproc env)
compound-procedure?
(vars compound-procedure-vars)
(bproc compound-procedure-bproc)
(env compound-procedure-env))
;;; Madlab procedures
(define-record-type <madlab-procedure>
(make-madlab-procedure preds bproc env)
madlab-procedure?
(preds madlab-procedure-varpreds)
(bproc madlab-procedure-bproc)
(env madlab-procedure-env))
;;; Tagged data and tag-aware procedures
(define-record-type <tag-aware>
(%make-tag-aware proc)
tag-aware?
(proc %tag-aware-proc))
(define-record-type <tagged>
(%make-tagged data tags)
tagged?
(data %tagged-data)
(tags %tagged-tags))
(define (make-tagged data tags)
(if (null? tags)
data
(%make-tagged data tags)))
;;; Procedures in general
(define (any-procedure? f)
(or (primitive-procedure? f)
(tag-aware? f)
(compound-procedure? f)
(madlab-procedure? f)))
;;; Environments
(define (extend-environment-twos var-val-twos base-environment)
(let ((vars-vals (list-of-twos->two-lists var-val-twos)))
(extend-environment (car vars-vals)
(cadr vars-vals)
base-environment)))
;; Environments are chains of frames, which are made of vectors.
(define (extend-environment variables values base-environment)
(if (fix:= (length variables) (length values))
(vector variables values base-environment)
(if (fix:< (length variables) (length values))
(error "Too many arguments supplied" variables values)
(error "Too few arguments supplied" variables values))))
(define (environment-variables env) (vector-ref env 0))
(define (environment-values env) (vector-ref env 1))
(define (environment-parent env) (vector-ref env 2))
(define the-empty-environment '())
(define (lookup-variable-value var env)
(let plp ((env env))
(if (eq? env the-empty-environment)
(lookup-scheme-value var)
(let scan
((vars (vector-ref env 0))
(vals (vector-ref env 1)))
(cond ((null? vars) (plp (vector-ref env 2)))
((eq? var (car vars)) (car vals))
(else (scan (cdr vars) (cdr vals))))))))
(define (define-variable! var val env)
(if (eq? env the-empty-environment)
(error "Unbound variable -- DEFINE" var) ;should not happen.
(let scan
((vars (vector-ref env 0))
(vals (vector-ref env 1)))
(cond ((null? vars)
(vector-set! env 0 (cons var (vector-ref env 0)))
(vector-set! env 1 (cons val (vector-ref env 1))))
((eq? var (car vars))
(set-car! vals val))
(else
(scan (cdr vars) (cdr vals)))))))
(define (set-variable-value! var val env)
(let plp ((env env))
(if (eq? env the-empty-environment)
(error "Unbound variable -- SET!" var)
(let scan
((vars (vector-ref env 0))
(vals (vector-ref env 1)))
(cond ((null? vars) (plp (vector-ref env 2)))
((eq? var (car vars)) (set-car! vals val))
(else (scan (cdr vars) (cdr vals))))))))
;;; Extension to make underlying Scheme values available to interpreter
(define (lookup-scheme-value var)
(lexical-reference generic-evaluation-environment var))