named let

This commit is contained in:
Danny Yoo 2011-03-16 14:04:02 -04:00
parent af698ab59b
commit d744c6d2a2
2 changed files with 39 additions and 0 deletions

View File

@ -36,6 +36,9 @@
(car actions)]
[else
(make-Seq actions)]))]
[(named-let? exp)
(parse-named-let exp)]
[(let? exp)
(parse-let exp)]
@ -189,7 +192,35 @@
`(let ([,(car vars) ,(car rhss)])
,(loop (cdr vars) (cdr rhss)))])))))
(define (parse-named-let exp)
(parse
`(letrec [(,(named-let-name exp)
(lambda ,(named-let-variables exp)
,@(named-let-body exp)))]
(,(named-let-name exp) ,@(named-let-rhss exp)))))
(define (named-let? exp)
(and (tagged-list? exp 'let)
(symbol? (cadr exp))))
(define (named-let-name exp)
(cadr exp))
(define (named-let-variables exp)
(map (lambda (clause)
(car clause))
(caddr exp)))
(define (named-let-rhss exp)
(map (lambda (clause)
(cadr clause))
(caddr exp)))
(define (named-let-body exp)
(cdddr exp))
;; any -> boolean
(define (let? exp)
(tagged-list? exp 'let))

View File

@ -639,6 +639,14 @@
(test '(let loop ([i 0])
(cond [(= i 5)
'(ok)]
[else (cons i (loop (add1 i)))]))
'(0 1 2 3 4 ok))
#;(test (read (open-input-file "tests/conform/program0.sch"))
(port->string (open-input-file "tests/conform/expected0.txt")))