;;--------------------------------------------------------------------- ;; ;; 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 ;; ;;--------------------------------------------------------------------- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 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))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 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))