macrotypes/stlc-via-racket-extended.rkt
2014-08-26 16:53:48 -04:00

32 lines
786 B
Racket

#lang s-exp "racket-extended-for-implementing-typed-langs.rkt"
(provide #%top-interaction)
(require (prefix-in r: racket/base))
(provide (rename-out [r:#%module-begin #%module-begin]))
;; Simply-Typed Lambda Calculus
;; - implemented with racket-extended language
;; - lam, app, and var only
(declare-built-in-types Int)
;; typed forms ----------------------------------------------------------------
(define-literal-type-rule integer : Int)
(define-literal-type-rule str : String)
(define-term/type-rule
(+ e ...) : Int
#:where
(e : Int) ...)
(define-term/type-rule
(λ ([x : τ] ...) e) : (τ ... τ_body)
#:where
(let τ_body := (typeof e)))
(define-term/type-rule
(#%app f e ...) : τ2
#:where
(let (τ1 ... τ2) := (typeof f))
(e : τ1) ...)