; Transform nested cons-expressions into list-expressions when possible ; (for readability). (define (listify program) (define (listdef def) (list 'define (cons (name def) (var def)) (listexp (body def)))) (define (listexp e) (if (null? e) e (if (boolean? e) e (if (number? e) e (if (atom? e) e (if (equal? (tag e) 'quote) e (if (equal? (tag e) 'if) (list 'if (listexp (e1 e)) (listexp (e2 e)) (listexp (e3 e))) (if (equal? (tag e) 'call) (cons 'call (cons (funname e) (map listexp (callargs e)))) (if (equal? (tag e) 'op) (let ((res (makelist e))) (cons (tag res) (cons (funname res) (map listexp (callargs res))))) (error 'scheme "Illegal Scheme0 expression: ~s" e)))))))))) (define (makelist e0) ; turn (cons e1 (cons e2 ... (cons en (quote ())) ...)) ; into (list e1 e2 ... en); ; leave any other expression unchanged. (define (h e res) (if (and (pair? e) (equal? (tag e) 'op) (equal? (funname e) 'cons)) ; (op cons e1 e2) (h (car (cdr (callargs e))) (cons (car (callargs e)) res)) (if (and (pair? e) (equal? (tag e) 'quote) (equal? (e1 e) ())) ; (quote ()) (cons 'op (cons 'list (reverse res))) e0 ))) (h e0 ())) (map listdef program))