-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathenv_store.rkt
More file actions
54 lines (39 loc) · 2.44 KB
/
env_store.rkt
File metadata and controls
54 lines (39 loc) · 2.44 KB
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
#lang racket
(require "eopl_errors.rkt")
(require "datatypes.rkt")
(require (lib "eopl.ss" "eopl"))
(define the-store '())
(define get-store (lambda () the-store))
(define newref (lambda (val) (let ((ref (length the-store))) (and (set! the-store (append the-store (list val))) (num-val ref)))))
(define deref (lambda (ref) (let ((size (length the-store))) (cases expval ref (num-val (num) (if (< num size) (list-ref the-store num) (report-invalid-reference!)))
(else (none-exp))))))
(define setref! (lambda (ref val) (let ((size (length the-store))) (cases expval ref (num-val (num) (if (< num size)
(set! the-store (update num val the-store '())) (report-invalid-reference!)))
(else (none-exp))))))
(define update (lambda (num val store current) (cond [(= 0 num) (append current (list val) (cdr store))]
[else (update (- num 1) val (cdr store) (append current (list (car store))))])))
;--------------------------------------------------------
(define PRINT_FUNC (function-thunk
(function-statement
(id-exp "print")
(assignment-parameter
(an-assignment
(id-exp "print_func")
(an-expression
(conjunction-exp
(inversion-exp (comp-exp (sum-expression (term-expression (factor-expression (power-expression (primary-expression (atom-exp (none-exp)))))))))))))
(a-statement
(simple-statement
(return-statement
(exp-return
(an-expression
(conjunction-exp
(inversion-exp
(comp-exp (sum-expression (term-expression (factor-expression (power-expression (primary-expression (atom-exp (id-exp "print_func"))))))))))))))))))
(define extend-env (lambda (var val env) (extend-environment var val env)))
(define function-env (lambda (name func) (extend-env name (newref (function-thunk func)) (empty-env))))
(define empty-env (lambda () (extend-env (id-exp "print") (newref PRINT_FUNC) (empty-environment))))
(define apply-env (lambda (var env) (cases environment env
(empty-environment () (report-no-binding-found! var))
(extend-environment (saved-var val saved-env) (if (equal? var saved-var) val (apply-env var saved-env))))))
(provide (all-defined-out))