Skip to content

Commit c32133b

Browse files
committed
c4 18-21
1 parent 590c2d0 commit c32133b

File tree

4 files changed

+180
-0
lines changed

4 files changed

+180
-0
lines changed

src/eval/c4_18.scm

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
; There is a series problem of the scanned out method shown in the exercise.
2+
(lambda ()
3+
(let ((u '*unassigned*)
4+
(v '*unassigned*))
5+
; Here, when some-expression is evaluated, if they contain circular dependance
6+
; like solve has, u/v may be evaluated, in which case an error reported.
7+
(let ((a 'some-expression)
8+
(b 'some-expression))
9+
(set! u a)
10+
(set! v b))
11+
'expressions))
12+
13+
14+
; here shows the case
15+
16+
(define (solve f y0 dt)
17+
(define y (integral (delay dy) y0 dt))
18+
(define dy (stream-map f y))
19+
y)
20+
21+
; ->
22+
23+
(define solve
24+
(lambda (f y0 dt)
25+
(let ((y '*assigned*)
26+
(dy '*assigned*))
27+
(let ((a (integral (delay dy) y0 dt))
28+
(b (stream-map f y)))
29+
(set! y a)
30+
(set! dy b)
31+
y))))
32+
33+
; ->
34+
(define solve
35+
(lambda (f y0 dt)
36+
((lambda (y dy)
37+
(let ((a (integral (delay dy) y0 dt))
38+
(b (stream-map f y)))
39+
(set! y a)
40+
(set! dy b)
41+
y))
42+
'*assigned*
43+
'*assigned*)))
44+
; ->
45+
(define solve
46+
(lambda (f y0 dt)
47+
((lambda (y dy)
48+
((lambda (a b)
49+
(set! y a)
50+
(set! dy b)
51+
y)
52+
; here, procedure args are evaluated, and error reported.
53+
(integral (delay dy) y0 dt)
54+
(stream-map f y))
55+
'*assigned*
56+
'*assigned*))
57+
))
58+
59+
60+
; apparently, there is no such problem for the one in the text

src/eval/c4_19.scm

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
(load "eval.scm")
2+
3+
; to enable scan-out-defines, try to modify it in eval.scm
4+
5+
(define (demo)
6+
(seck-eval '(let ((a 1))
7+
(define (f x)
8+
(define b (+ a x))
9+
(define a 5)
10+
(+ a b))
11+
(f 10))
12+
global-env)
13+
)
14+
(let ((a 1))
15+
(define (f x)
16+
(define b (+ a x))
17+
(define a 5)
18+
(+ a b))
19+
(f 10))

src/eval/c4_20.scm

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
; a) in eval.scm
2+
; b) let's do some evaluation manually
3+
4+
; for letrec
5+
6+
(letrec ((even?
7+
(lambda (n)
8+
(if (= n 0)
9+
true
10+
(odd? (- n 1)))))
11+
(odd?
12+
(lambda (n)
13+
(if (= n 0)
14+
false
15+
(even? (- n 1))))))
16+
<exp>)
17+
18+
; ->
19+
20+
(let ((even? '*assigned*)
21+
(odd? '*assigned*))
22+
(set! even? ...)
23+
(set! odd? ...)
24+
<exp>)
25+
; ->
26+
((lambda (even? odd?)
27+
(set! even? ...)
28+
(set! odd? ...))
29+
'*assigned*
30+
'*assigned*
31+
)
32+
33+
; but for let
34+
35+
(let ((even? ...)
36+
(odd? ...))
37+
(even? x))
38+
39+
; ->
40+
41+
((lambda (even? odd?)
42+
(even? x))
43+
; here, when evaluating the following lambda procedure,
44+
; odd?, even? will be looked up in the lambda procedure environment(lexical scoping),
45+
; therefore, they will not be found.
46+
(lambda (n)
47+
(if (= n 0)
48+
true
49+
(odd? (- n 1))))
50+
(lambda (n)
51+
(if (= n 0)
52+
false
53+
(even? (- n 1))))
54+
)
55+
56+
; so, the internal diff between letrec and let is, letrec keeps the environment
57+
; for argument in the let body.

src/eval/c4_21.scm

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
(load "eval.scm")
2+
3+
(define fact-exp '((lambda (n)
4+
((lambda (fact)
5+
(fact fact n))
6+
(lambda (ft k)
7+
(if (= k 1)
8+
1
9+
(* k (ft ft (- k 1)))))))
10+
10))
11+
12+
; a)
13+
; (println (seck-eval fact-exp global-env))
14+
15+
16+
(define fib-exp '((lambda (n)
17+
((lambda (fib)
18+
(fib fib 0 1 0)
19+
)
20+
(lambda (fib a b k)
21+
(if (= k n)
22+
b
23+
(fib fib b (+ a b) (+ 1 k))))
24+
))
25+
10))
26+
27+
; (println (seck-eval fib-exp global-env))
28+
29+
; b)
30+
31+
(define f-exp '(define (f x)
32+
((lambda (even? odd?)
33+
(even? even? odd? x))
34+
(lambda (ev? od? n)
35+
(if (= n 0)
36+
true
37+
(od? ev? od? (- n 1))))
38+
(lambda (ev? od? n)
39+
(if (= n 0)
40+
false
41+
(ev? ev? od? (- n 1)))))))
42+
43+
(seck-eval f-exp global-env)
44+
(println (seck-eval '(f 4) global-env))

0 commit comments

Comments
 (0)