(define-record-type lit (fields datum)) (define-record-type varref (fields var)) (define-record-type function (fields formal body)) (define-record-type app (fields rator rand)) (define parse (lambda (datum) (cond ((number? datum) (make-lit datum)) ((symbol? datum) (make-varref datum)) ((pair? datum) (if (eq? (car datum) 'lambda) (make-function (caadr datum) (parse (caddr datum))) (make-app (parse (car datum)) (parse (cadr datum))))) (else (error 'parse "Invalid concrete syntax" datum)))))