File tree Expand file tree Collapse file tree 4 files changed +180
-0
lines changed Expand file tree Collapse file tree 4 files changed +180
-0
lines changed Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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 ))
Original file line number Diff line number Diff line change
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.
Original file line number Diff line number Diff line change
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))
You can’t perform that action at this time.
0 commit comments