-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathEx01a.fst
63 lines (45 loc) · 1.64 KB
/
Ex01a.fst
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
module Ex01a
open FStar.All
//safe-read-write
type filename = string
(* canWrite is a function specifying whether or not a file f can be written *)
let canWrite (f:filename) =
match f with
| "demo/tempfile" -> true
| _ -> false
(* canRead is also a function ... *)
let canRead (f:filename) =
canWrite f (* writeable files are also readable *)
|| f="demo/README" (* and so is this file *)
val read : f:filename{canRead f} -> ML string
let read f = FStar.IO.print_string ("Dummy read of file " ^ f ^ "\n"); f
val write : f:filename{canWrite f} -> string -> ML unit
let write f s = FStar.IO.print_string ("Dummy write of string " ^ s ^ " to file " ^ f ^ "\n")
let passwd = "demo/password"
let readme = "demo/README"
let tmp = "demo/tempfile"
val staticChecking : unit -> ML unit
let staticChecking () =
let v1 = read tmp in
let v2 = read readme in
(* let v3 = read passwd in -- invalid read, fails type-checking *)
write tmp "hello!"
(* ; write passwd "junk" -- invalid write , fails type-checking *)
exception InvalidRead
val checkedRead : filename -> ML string
let checkedRead f =
if canRead f then read f else raise InvalidRead
val checkedWrite : filename -> string -> ML unit
// solution here
//
//
exception InvalidWrite
let checkedWrite file text =
if canWrite file then write file text else raise InvalidWrite
let dynamicChecking () =
let v1 = checkedRead tmp in
let v2 = checkedRead readme in
let v3 = checkedRead passwd in (* this raises exception *)
checkedWrite tmp "hello!";
checkedWrite passwd "junk" (* this raises exception *)
let main = staticChecking (); dynamicChecking ()