(load "chez-init.ss") (define-datatype expression expression? (var-exp (id symbol?)) (lambda-exp (id symbol?) (body expression?)) (app-exp (rator expression?) (rand expression?))) (define parse (lambda (exp) (cond [(symbol? exp) (var-exp exp)] [(pair? exp) (cond [(eq? (car exp) 'lambda) (lambda-exp (caadr exp) (parse (caddr exp)))] [(> (length exp) 2) (eopl:error 'parse "Invalid concrete syntax ~s" exp)] [else (app-exp (parse (car exp)) (parse (cadr exp)))])] [(eopl:error 'parse "Invalid concrete syntax ~s" exp)]))) (define parse-expression (lambda (datum) (cond [(symbol? datum) (var-exp datum)] [(pair? datum) (if (eqv? (car datum) 'lambda) (lambda-exp (caadr datum) (parse-expression (caddr datum))) (app-exp (parse-expression (car datum)) (parse-expression (cadr datum))))] [else (eopl:error 'parse-expression "Invalid concrete syntax ~s" datum)]))) (define unparse-expression (lambda (exp) (cases expression exp [var-exp (id) id] [lambda-exp (id body) (list 'lambda (list id) (unparse-expression body))] [app-exp (rator rand) (list (unparse-expression rator) (unparse-expression rand))]))) (define unparse-expression-pseudo-java (lambda (exp) (cases expression exp (var-exp (id) (symbol->string id)) (lambda-exp (id body) (string-append "unnamed (" (symbol->string id) ") {" (unparse-expression-pseudo-java body) "}")) (app-exp (rator rand) (string-append (unparse-expression-pseudo-java rator) "(" (unparse-expression-pseudo-java rand) ");")))))