32 lines
807 B
Racket
32 lines
807 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, var, +, and int literals only
|
|
|
|
(declare-base-types → Int)
|
|
|
|
;; typed forms ----------------------------------------------------------------
|
|
|
|
(define-literal-type-rule integer : Int)
|
|
|
|
(define-primop + : (Int Int → Int))
|
|
#;(define-simple-syntax/type-rule
|
|
(+ e ...) : Int
|
|
#:where
|
|
(e : Int) ...)
|
|
|
|
(define-typed-syntax
|
|
(λ ([x : τ] ...) e) : (τ ... → τ_body)
|
|
#:where
|
|
(let τ_body := (typeof e)))
|
|
|
|
(define-typed-syntax
|
|
(#%app f e ...) : τ2
|
|
#:where
|
|
(let (τ1 ... → τ2) := (typeof f))
|
|
(e : τ1) ...)
|