37 lines
1.2 KiB
Racket
37 lines
1.2 KiB
Racket
#lang typed/racket
|
||
(define-type ConId Integer)
|
||
(define-type Arity Integer)
|
||
(define-type Let (∪ 'let 'letrec))
|
||
(define-type Name Symbol)
|
||
|
||
|
||
(define-type (Bind A) (List A (Expr A)))
|
||
(define-type (Binds A) (Pair (Bind A) (Listof (Bind A))))
|
||
(define-type (Alt A) (List ConId (Listof A) (Expr A)))
|
||
(define-type (Alts A) (Pair (Alt A) (Listof (Alt A))))
|
||
|
||
(define-type (Expr A)
|
||
(∪ Name
|
||
Integer
|
||
(List 'pack ConId Arity)
|
||
(List (Expr A) (Expr A))
|
||
(List Let (Binds A) (Expr A))
|
||
(List 'case (Expr A) (Alts A))
|
||
(List 'λ (Pair Name (Listof Name)) (Expr A))))
|
||
|
||
(define-type (ScDefn A) (List 'define (Pair Name (Listof A)) (Expr A)))
|
||
(define-type (Program A) (Pair (ScDefn A) (Listof (ScDefn A))))
|
||
(define-type CoreExpr (Expr Name))
|
||
(define-type CoreScDefn (ScDefn Name))
|
||
(define-type CoreProgram (Program Name))
|
||
(define-type CoreBind (Bind Name))
|
||
(define-type CoreAlt (Alt Name))
|
||
(define-type CoreBinds (Binds Name))
|
||
(define-type CoreAlts (Alts Name))
|
||
|
||
(: scdefn-name (All (A) (-> (ScDefn A) Name) ))
|
||
(define (scdefn-name a)
|
||
(match a
|
||
[(list 'define (cons n _) _) n]))
|
||
|
||
(provide CoreExpr CoreScDefn CoreProgram CoreBind CoreAlt Expr Bind Alt Name Let Arity ConId CoreAlts CoreBinds scdefn-name)
|