Skip to content

Commit 11f5b63

Browse files
committed
added: call-by-value interpreter
1 parent 991aadc commit 11f5b63

File tree

2 files changed

+68
-1
lines changed

2 files changed

+68
-1
lines changed

encoding.scm

+1-1
Original file line numberDiff line numberDiff line change
@@ -83,5 +83,5 @@
8383

8484

8585
;; example use:
86-
(decode-number (eval `(,! ,lfive)))
86+
;; (decode-number (eval `(,! ,lfive)))
8787

interp-call-by-value.ss

+67
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
;; A call-by-value interpreter for lambda calculus with primitive operators
2+
3+
;; author: Yin Wang ([email protected])
4+
5+
6+
(load "pmatch.scm")
7+
(load "encoding.scm")
8+
9+
10+
;; environment
11+
(define env0 '())
12+
13+
(define ext-env
14+
(lambda (x v env)
15+
(cons `(,x . ,v) env)))
16+
17+
(define lookup
18+
(lambda (x env)
19+
(let ([p (assq x env)])
20+
(cond
21+
[(not p) x]
22+
[else (cdr p)]))))
23+
24+
25+
;; closure "structure"
26+
(define make-closure
27+
(lambda (f env)
28+
(list 'closure f env)))
29+
30+
(define closure-func cadr)
31+
(define closure-env caddr)
32+
33+
(define closure?
34+
(lambda (x)
35+
(and (pair? x)
36+
(eq? (car x) 'closure))))
37+
38+
39+
40+
;; cbv interpreter
41+
(define interp1
42+
(lambda (exp env)
43+
(pmatch exp
44+
[,x (guard (symbol? x)) (lookup x env)]
45+
[,x (guard (number? x)) x]
46+
[(lambda (,x) ,e)
47+
(make-closure exp env)]
48+
[(,e1 ,e2)
49+
(let ([v1 (interp1 e1 env)]
50+
[v2 (interp1 e2 env)])
51+
(pmatch v1
52+
[(closure (lambda (,x) ,e) ,env1)
53+
(interp1 e (ext-env x v2 env1))]
54+
[,other
55+
(eval `(,v1 ,v2))]))]
56+
[,exp (eval exp)])))
57+
58+
59+
(define interp
60+
(lambda (exp)
61+
(interp1 exp env0)))
62+
63+
64+
65+
;; ------------------------ tests -------------------------
66+
(interp `(((,ltwo ,ltwo) add1) 1))
67+
;; => 5

0 commit comments

Comments
 (0)