UNB/ CS/ David Bremner/ teaching/ cs3613/ lectures/ examples/ racket/ tlistex3.rkt
#lang plai

(require "tvrcfae-t.rkt")

(define (list-env ex) (with-type 'numlist
                           'empty (numTE)
                           'cons  (pairTE (numTE) (idTE 'numlist))
                           ex))

(define nil (app (id 'empty) (num 0)))

(define (conz n l)
  (app (id 'cons)
       (pair (num n) l)))

(define (extract l)
  (list-env
   (cases 'numlist l
          'empty 'n (id 'n)
          'cons 'p (fst (id 'p)))))


(test (interp (extract nil) (mtSub)) (numV 0))
(test (interp (extract (conz 1 nil)) (mtSub)) (numV 1))
%