試験スルーで軽く、ということで勘弁してもらう方向。 unparse が以下なのかどうか。
(define unparse-expression
(lambda (exp)
(cases term exp
(var-term (id) id)
(constant-term (datum) datum)
(app-term (terms)
(let app-term-unparse ((terms terms) (ret '()))
(if (null? terms)
(reverse ret)
(app-term-unparse (cdr terms) (cons (unparse-expression (car terms)) ret))))))))
あるいは parse-expression が以下?
(define parse-expression
(lambda (datum)
(cond
((symbol? datum) (var-exp datum))
((constant? datum) (constant-term datum))
(((list-of -term?) datum) (app-term datum)))))
これは酷い。(list-of term?) をスルーすべきかどうか迷うな。list-of てソレが実在するのかどうかは別途確認の方向にて。
all-ids
ということでスルー。Ex.2.10 の all-ids の定義が以下。
(define all-ids
(lambda (exp)
(delete-duplicates (flatten (enum-ids exp)))))
enum-ids を書換えてみます。
(define enum-ids
(lambda (exp)
(cases term exp
(var-exp (id) id)
(constant-term (datum) '())
(app-term (terms)
(let app-term-enum ((terms terms) (ret '()))
(if (null? terms)
ret
(app-term-enum (cdr terms) (cons (enum-ids (car terms)) ret))))))))