;;--------------------------------------------------------------------- ;; ;; P R O J E C T 2 : T I N Y T Y P E R E C O N S T R U C T I O N ;; ;; CS515 Ulrich Kremer ;; Fall 2011 ;;--------------------------------------------------------------------- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Parser ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (define CurrentCounter 0) (define newtvar (lambda() (set! CurrentCounter (+ CurrentCounter 1)) (string->symbol (string-append "_a" (number->string CurrentCounter))))) (define name? (lambda (s) (and (symbol? s) (not (memq s '(lambda)))))) (define parse (lambda (m) (cond ((number? m) `(&const ,m)) ((eq? #t m) `(&const true)) ((eq? #f m) `(&const false)) ((name? m) `(&var ,m)) ((pair? m) (cond ((eq? `lambda (car m)) (if (and (= 3 (length m)) (list? (cadr m)) (= 1 (length (cadr m))) (name? (caadr m))) `(&lambda ,(cadr m) ,(parse (caddr m))) (error 'parse "Syntax error"))) (else `(&apply ,(parse (car m)) ,(parse (cadr m)))))) (else (error 'parse "Syntax error"))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Initial Type Environment ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (define init_E '((add1 (int -> int)) (sub1 (int -> int)) (zero? (int -> bool)) (not (bool -> bool)) (and (bool -> (bool -> bool))) (or (bool -> (bool -> bool))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Sample Test cases ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (define M1 '((lambda (x) x) 5)) (define M2 '((lambda (x) (sub1 x)) 5)) (define M3 '((lambda (x) 1) ((lambda (x) (x x)) (lambda (x) (x x))))) (define M4 '((lambda (x) ((and x) #f)) #t))