/* 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;;