#lang racket

(require redex)
(provide TL)

(define-language TL
  (e a
     (a ... e)
     (letrec ([σ v] ...) e)
     (w-c-m a a e)
     (c-c-m [a ...])
     (match a l ...)
     (abort e))
  
  (l [(K x ...) e])
  (a w 
     (K a ...))
  (w v
     x)
  (v (λ (x ...) e)
     (K v ...)
     σ)
  
  (x variable-not-otherwise-mentioned)
  (σ (ref variable))
  
  (Σ ∅
     (Σ [σ ↦ v]))
  
  (K string))