Skip to content

Commit ed18904

Browse files
committed
c4_7 updatE
1 parent 3bfbddc commit ed18904

File tree

2 files changed

+23
-21
lines changed

2 files changed

+23
-21
lines changed

src/eval/c4_7.scm

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
11
; in eval.scm
2+
;
3+
;not need to expand let* in terms of non-derived expressions

src/eval/eval.scm

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,7 @@
183183
(list '> >)
184184
(list '< <)
185185
(list '= =)
186+
(list 'print print)
186187
))
187188

188189
(define (primitive-procedure-names)
@@ -394,31 +395,36 @@
394395
(define (let-vals exp) (map cadr (let-bindings exp)))
395396

396397
(define (let->combination exp)
397-
(make-let (let-vars exp)
398-
(let-vals exp) ; todo
399-
(let-body exp)))
398+
(let->lambda (let-vars exp)
399+
(let-vals exp) ; todo
400+
(let-body exp)))
400401

401-
(define (make-let vars values body)
402+
(define (let->lambda vars values body)
402403
(cons (cons 'lambda
403404
(cons vars body))
404405
values))
405406

407+
(define (make-let var-bindings body)
408+
(cons 'let
409+
(cons var-bindings
410+
body)))
411+
406412
(define (letstar? exp)
407413
(tagged-list? exp 'let*))
408414

409415
(define (let*->nested-let exp)
410416
(define (wrap-let-body vars values)
411417
(cond ((and (null? vars)
412418
(null? values))
413-
(make-let vars values (let-body exp)))
419+
(make-let '() (let-body exp)))
414420
((or (null? vars)
415421
(null? values))
416422
(error 'wrap-let-body "let vars-values length not match"))
417423
(else
418-
(make-let (list (car vars))
419-
(list (car values))
420-
(wrap-let-body (cdr vars)
421-
(cdr values))))
424+
(make-let (list (list (car vars)
425+
(car values)))
426+
(list (wrap-let-body (cdr vars)
427+
(cdr values)))))
422428
))
423429
(wrap-let-body (let-vars exp)
424430
(let-vals exp) ; todo
@@ -494,17 +500,11 @@
494500
(cons a b))
495501
new-env)
496502
(cons 3 4)))
497-
(display (let*->nested-let '(let* ((x 1)
498-
(y (+ x 1))
499-
(z (+ x a))
503+
(assert (equal? (seck-eval '(let* ((x 1)
504+
(y (+ x a))
505+
(z (+ x y))
500506
)
501-
(+ x y z))))(newline)
502-
(assert-eq (seck-eval '(let* ((x 1)
503-
(y (+ x 1))
504-
(z (+ x a))
505-
)
506-
(+ x y z))
507-
new-env)
508-
8
509-
=)
507+
(+ x y z))
508+
new-env)
509+
12))
510510
))

0 commit comments

Comments
 (0)