/* Examples of functions */
   lambda x. x;;
   fun(f,x, acc[read](x); raise);;
   fun(f,x, if acc[read](x) then true else raise);;


   /* Valid program (TryWith pattern)*/
   let z = new[read*;close]()
   in  try  if acc[read](z) then acc[close](z) else raise
       with acc[close](z);;


   /* Valid program (TryClose pattern) */
   let z = new[read*;close]()
   in  (try if acc[read](z) then true else raise with true);acc[close](z);;


   /* Valid program */
   lambda x. 
     let z = new[write*;close]()
     in  try
           if acc[read](x) then acc[write](z);acc[close](z)
                           else raise
         with 
           acc[close](z);;


   /* Invalid program */
   let backup
        = lambda x. 
            let z = new[write*;close]()
            in  try
                  if acc[read](x) then acc[write](z);acc[close](z)
                                  else raise
                with 
                  acc[close](z)
   in
   let y = new[read*;close]()
   in
       backup y;;


   /*** Valid, but ill-typed program ***/
   let x = new[read*;close]()  in
   let y = new[read*;close]() 
   in
   let g = fun(f,z, (if acc[read](x) then true else raise); acc[read](y); f true)
   in  
       try  
            g true
       with 
            acc[close](x); acc[close](y);;


   /*** Valid program ***/
   let x = new[read*;close]()  in
   let y = new[read*;close]() 
   in
       try  
            fun(f,z, (if acc[read](x) then true else raise); acc[read](y); f true) true
       with 
            acc[close](x); acc[close](y);;


   /*** Valid program ***/
   let create = fun(f,x, let y=new[read*;close]() in (acc[read](y);y)) in 
   let use = fun(f, x, if acc[read](x) then raise else f x) in 
   let repeat = fun(g,x, let z = create x in try (use z; g x) with acc[close](z)) in
   repeat true;;


   /*** Valid program ***/
   let create = fun(f,x, let y=new[read*;close]() in (acc[read](y);y)) in 
   let use = fun(f, x, if acc[read](x) then raise else f x) in 
   let repeat = fun(g,x, let z = create x in try (g x;use z) with acc[close](z)) in
   repeat true;;


   /*** Invalid program ***/
   let create = fun(f,x, let y=new[read*;close]() in y) in 
   let repeat = 
      fun(g,x, let z = create true
               in  try (if   acc[read](z)
	                then raise
		        else (g true;acc[read](z)))
	           with acc[close](z)) in
   repeat true;;