;; In-class lang0.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) (cases s-expression exp (literal-exp (datum) datum) (variable-exp (var) (lookup var)) (application-exp (rator rand) (apply-prim-proc (m rator) (m rand))) (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) (cond ((eq? var 'x) 21) ((eq? var 'y) 42) ((eq? var 'add1) 'add1) ;; HACK! (else (error 'lookup "no such variable ~s" var))))) ;; Tests: ;; (parse 6) ;; (parse 'x) ;; (parse 'y) ;; (parse '(add1 100)) ;; (parse '(add1 (add1 x))) ;; > (m (parse 6)) ;; 6 ;; >(m (parse 'x)) ;; 21 ;; > (m (parse 'y)) ;; 42 ;; > (m (parse '(add1 100))) ;; 101 ;; > (m (parse '(add1 (add1 x)))) ;; 23