|
69 | 69 | (lambda (env) (make-procedure params body-proc env))))
|
70 | 70 |
|
71 | 71 | (define (analyze-sequence exp)
|
| 72 | + (define (combine proc1 proc2) |
| 73 | + (lambda (env) |
| 74 | + (proc1 env) |
| 75 | + (proc2 env))) |
72 | 76 | (define (combine-seq-proc seq-proc)
|
| 77 | + ; (println "combine-seq-proc") |
73 | 78 | (if (null? (cdr seq-proc))
|
74 | 79 | (car seq-proc)
|
75 |
| - (lambda (env) |
76 |
| - ((car seq-proc) env) |
77 |
| - ((combine-seq-proc (cdr seq-proc)) env)))) |
| 80 | + (combine (car seq-proc) |
| 81 | + (combine-seq-proc (cdr seq-proc))))) |
78 | 82 | (let ((seq-proc (map analyze exp)))
|
79 | 83 | (if (null? seq-proc)
|
80 | 84 | (error 'analyze-sequence "no expression in code block")
|
81 | 85 | (combine-seq-proc seq-proc))))
|
82 | 86 |
|
| 87 | +(define (analyze-sequence-text exps) |
| 88 | + (define (sequentially proc1 proc2) |
| 89 | + (lambda (env) (proc1 env) (proc2 env))) |
| 90 | + (define (loop first-proc rest-procs) |
| 91 | + ; (println "loop") |
| 92 | + (if (null? rest-procs) |
| 93 | + first-proc |
| 94 | + (loop (sequentially first-proc (car rest-procs)) |
| 95 | + (cdr rest-procs)))) |
| 96 | + (let ((procs (map analyze exps))) |
| 97 | + (if (null? procs) |
| 98 | + (error "Empty sequence -- ANALYZE")) |
| 99 | + (loop (car procs) (cdr procs)))) |
| 100 | + |
| 101 | +(define (analyze-sequence-alyssa exps) |
| 102 | + (define (execute-sequence procs env) |
| 103 | + (cond ((null? (cdr procs)) |
| 104 | + ((car procs) env)) |
| 105 | + (else ((car procs) env) |
| 106 | + (execute-sequence (cdr procs) env)))) |
| 107 | + (let ((procs (map analyze exps))) |
| 108 | + (if (null? procs) |
| 109 | + (error "Empty sequence -- ANALYZE")) |
| 110 | + (lambda (env) (execute-sequence procs env)))) |
| 111 | + |
83 | 112 | (define (analyze-application exp)
|
84 | 113 | (let ((fproc (analyze (operator exp)))
|
85 | 114 | (aprocs (map analyze (operand exp))))
|
|
125 | 154 | (set! a (* a b))
|
126 | 155 | (+ a b))
|
127 | 156 | global-env))
|
| 157 | + |
| 158 | +(define seq1 '((set! a b) |
| 159 | + (cons a b) |
| 160 | + (cons a b) |
| 161 | + (cons a b) |
| 162 | + (cons a b))) |
| 163 | + |
| 164 | +(define seq2 '((cons a b))) |
0 commit comments