Skip to content

Commit 64cf7c6

Browse files
committed
c4 16
1 parent 36c8e2d commit 64cf7c6

File tree

4 files changed

+45
-50
lines changed

4 files changed

+45
-50
lines changed

src/eval/c4_16.scm

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,6 @@
55
; in procedure-body, scan-out-defines is evaluated when
66
; procedure evaluated. It's just a matter of whether
77
; we want the internal definition to be lazy.
8+
; Note when implement scan-out-defines, to pass
9+
; a (quote symbol) to the evaluator, you have to
10+
; pass (quote (quote symbol)), see my explanation in eval.scm

src/eval/demo.scm

Lines changed: 4 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,4 @@
1-
(define (fib n)
2-
(display (let fib-iter ((a 1)
3-
(b 0)
4-
(count n))
5-
(if (= count 0)
6-
b
7-
(fib-iter (+ a b) a (- count 1))))
8-
)
9-
(display fib-iter)
10-
)
11-
12-
13-
((lambda ()
14-
(define fib-iter
15-
(lambda (a b count)
16-
(if (= count 0)
17-
b
18-
(fib-iter (+ a b) a (- count 1))
19-
)
20-
))
21-
(fib-iter 1 0 10)
22-
)
23-
)
1+
(let ((b *unassigned*) (a *unassigned*))
2+
(set! b (+ a x))
3+
(set! a 5)
4+
(+ a b c))

src/eval/eval.scm

Lines changed: 20 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,10 @@
237237
(tagged-list? proc 'procedure))
238238

239239
(define (make-procedure params body-seq env)
240-
(list 'procedure params body-seq env))
240+
(list 'procedure
241+
params
242+
(scan-out-defines body-seq)
243+
env))
241244

242245
(define (procedure-parameters proc)
243246
(cadr proc))
@@ -262,16 +265,23 @@
262265
(let ((definitions (filter definition? proc-body))
263266
(non-definitions (filter (compose not definition?)
264267
proc-body)))
265-
(make-let (map (lambda (exp)
266-
(list (definition-var exp)
267-
'*unassigned*))
268-
definitions)
269-
(append (map (lambda (exp)
270-
(list 'set!
271-
(definition-var exp)
272-
(definition-value exp)))
268+
(if (not (null? definitions))
269+
(list (make-let (map (lambda (exp)
270+
(list (definition-var exp)
271+
;; Here, we use '', since
272+
;; we want to pass a (quote symbol) to the evaluator,
273+
;; but not a symbol to the evaluator. The outer quote
274+
;; will be used to protect (quote symbol) in
275+
;; the naive scheme evaluator.
276+
''*unassigned*))
273277
definitions)
274-
non-definitions))))
278+
(append (map (lambda (exp)
279+
(list 'set!
280+
(definition-var exp)
281+
(definition-value exp)))
282+
definitions)
283+
non-definitions)))
284+
proc-body)))
275285

276286
; @(assignment)
277287

@@ -610,20 +620,3 @@
610620
global-env))
611621
(define (test-scan-out-definitons)
612622
(scan-out-defines (procedure-body proc)))
613-
614-
(define (test-scoping)
615-
; if it's lexical scoping, it will return 7
616-
; but if it's dynamic scoping, it will return 8
617-
(let ((new-env (make-env global-env)))
618-
(seck-eval '(define a 4)
619-
new-env)
620-
(seck-eval '(define (foo)
621-
(+ a 3))
622-
new-env)
623-
(seck-eval '(define (bar)
624-
(define a 5)
625-
(foo))
626-
new-env)
627-
(println (seck-eval '(bar)
628-
new-env))
629-
))

src/eval/scoping.scm

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
(load "eval.scm")
2+
3+
(define (test-scoping)
4+
; if it's lexical scoping, it will return 7
5+
; but if it's dynamic scoping, it will return 8
6+
(let ((new-env (make-env global-env)))
7+
(seck-eval '(define a 4)
8+
new-env)
9+
(seck-eval '(define (foo)
10+
(+ a 3))
11+
new-env)
12+
(seck-eval '(define (bar)
13+
(define a 5)
14+
(foo))
15+
new-env)
16+
(println (seck-eval '(bar)
17+
new-env))
18+
))

0 commit comments

Comments
 (0)