#lang racket (require "chez-init.rkt") (require racket/trace) ;::= ; ::= ; ::= (if ) ; ::= (lambda (+) ) ; ::= ( +) (define-datatype expression expression? [var-exp (id symbol?)] [num-exp (val number?)] [if-exp (condition expression?) (if-true expression?) (if-false expression?)] [lambda-exp (ids (listof symbol?)) (body expression?)] [app-exp (da-exp (listof expression?))]) (define parse-exp (lambda (input) (cond [(symbol? input) [var-exp input]] [(number? input) [num-exp input]] [(pair? input) (cond [(eq? (car input) 'lambda) [lambda-exp (cadr input) (parse-exp (caddr input))]] [(eq? (car input) 'if) [if-exp (parse-exp (cadr input)) (parse-exp (caddr input)) (parse-exp (cadddr input))]] [else [app-exp (map parse-exp input)]])] [else 'error]))) (define unparse-exp (lambda (parse-tree) (cases expression parse-tree [var-exp (id) id] [num-exp (val) val] [if-exp (condition if-true if-false) (list 'if (unparse-exp condition) (unparse-exp if-true) (unparse-exp if-false))] [lambda-exp (ids body) (list 'lambda ids (unparse-exp body))] [app-exp (da-exp) (map unparse-exp da-exp)])))