;; In-class lang0.5.ss ;; Doug Blank (load "petite-init.ss") (define-datatype s-expression s-expression? (literal-exp (datum number?)) (variable-exp (var symbol?)) (application-exp (rator s-expression?) (rand s-expression?))) (define parse (lambda (s-exp) ;; this is a list! (cond ((number? s-exp) (literal-exp s-exp)) ((symbol? s-exp) (variable-exp s-exp)) ((list? s-exp) (application-exp (parse (car s-exp)) (parse (cadr s-exp)))) (else (error 'parse "can not parse ~s" s-exp))))) (define m (lambda (exp env) (cases s-expression exp (literal-exp (datum) datum) (variable-exp (var) (lookup var)) (application-exp (rator rand) (apply-prim-proc (m rator env) (m rand env))) (else (error 'm "cannot interpret expression ~s" exp))))) (define apply-prim-proc (lambda (proc arg) (cond ((eq? proc 'add1) (+ 1 arg)) (else (error 'apply "unknown procedure ~s" proc))))) (define lookup (lambda (var env) ...)) (define make-empty-env (lambda () ...)) (define extend-env (lambda (var val env) ...)) (define top-level-env (extend-env 'x 21 (extend-env 'y 42 (extend-env 'add1 'add1 (make-empty-env))))) ;; Tests: ;; (parse 6) ;; (parse 'x) ;; (parse 'y) ;; (parse '(add1 100)) ;; (parse '(add1 (add1 x))) ;; > (m (parse 6) top-level-env) ;; 6 ;; >(m (parse 'x) top-level-env) ;; 21 ;; > (m (parse 'y) top-level-env) ;; 42 ;; > (m (parse '(add1 100)) top-level-env) ;; 101 ;; > (m (parse '(add1 (add1 x))) top-level-env) ;; 23