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