Skip to content

Commit 99710e5

Browse files
authored
Merge pull request #133 from engboris/interactive
Use macros in Turing machine example and add attempts in watcher
2 parents 1d1c407 + e755c5d commit 99710e5

File tree

5 files changed

+69
-47
lines changed

5 files changed

+69
-47
lines changed

bin/sgen.ml

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -81,24 +81,25 @@ let watch input_file timeout =
8181
let _ = run_with_timeout input_file timeout in
8282

8383
(* Polling approach - check file modification time *)
84-
let rec poll_loop last_mtime =
84+
let rec poll_loop last_mtime attempt =
8585
Unix.sleepf 0.5;
8686
try
8787
let stat = Unix.stat abs_path in
8888
let current_mtime = stat.Unix.st_mtime in
8989
if Float.(current_mtime > last_mtime) then (
90-
Stdlib.Printf.printf "\n\n--- File changed, re-running ---\n%!";
90+
Stdlib.Printf.printf
91+
"\n\n--- File changed, re-running (attempt #%d) ---\n%!" attempt;
9192
let _ = run_with_timeout input_file timeout in
92-
poll_loop current_mtime )
93-
else poll_loop last_mtime
93+
poll_loop current_mtime (attempt + 1) )
94+
else poll_loop last_mtime attempt
9495
with Unix.Unix_error _ ->
9596
Stdlib.Printf.eprintf "Error accessing file, retrying...\n%!";
9697
Unix.sleepf 1.0;
97-
poll_loop last_mtime
98+
poll_loop last_mtime attempt
9899
in
99100

100101
let initial_stat = Unix.stat abs_path in
101-
poll_loop initial_stat.Unix.st_mtime
102+
poll_loop initial_stat.Unix.st_mtime 2
102103

103104
let preprocess_only input_file =
104105
let expr = parse input_file in
File renamed without changes.
File renamed without changes.

examples/stack.sg

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,21 @@
1+
(:= (init C) (+stack 0 []))
2+
13
<show interact (process
2-
(+stack0 [])
4+
#(init 0)
35
'push 1 then 0
4-
[(-stack0 X) (+stack1 [1|X])]
5-
[(-stack1 X) (+stack2 [0|X])]
6+
[(-stack 0 X) (+stack 1 [1|X])]
7+
[(-stack 1 X) (+stack 2 [0|X])]
68

79
'pop & save
8-
[(-stack2 [C|X]) (+stack3 X) (+save C)]
10+
[(-stack 2 [C|X]) (+stack 3 X) (+save C)]
911

1012
'conditional duplication
11-
[(-stack3 [0|X]) (+stack4 [0 0|X])]
12-
[(-stack3 [1|X]) (+stack4 [1 1|X])]
13+
[(-stack 3 [0|X]) (+stack 4 [0 0|X])]
14+
[(-stack 3 [1|X]) (+stack 4 [1 1|X])]
1315

1416
'freeze information
1517
[(-save C) (save C)]
1618

1719
'clean
18-
[(-stack4 _)])>
20+
[(-stack 4 _)]
21+
)>

examples/turing.sg

Lines changed: 52 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,58 @@
1+
(:= (initial Q) {
2+
[(-i [C|W]) (+m Q [e e] C W)]
3+
[(-i []) (+m Q e e e)]
4+
})
5+
6+
(:= (accept Q) [(-m qa L e R) accept])
7+
(:= (reject Q) [(-m qr L C R) reject])
8+
9+
(:= (if Q1 then Q2) [(-m Q1 L e R) (+m Q2 L e R)])
10+
(:= (skip right on Q , D) [(-m Q L D [C|R]) (+m Q [D|L] C R)])
11+
12+
(:= (if C1 on Q1 then Q2 , write C2 , right)
13+
[(-m Q1 L C1 [C|R]) (+m Q2 [C2|L] C R)])
14+
15+
(:= (if C1 on Q1 then Q2 , write C2 , left)
16+
[(-m Q1 [C|L] C1 R) (+m Q2 L C [C2|R])])
17+
118
' Turing machine accepting words with as many 'a' as 'b'
219
(:= mt {
3-
'initial
4-
[(-i [C|W]) (+m q0 [e e] C W)]
5-
[(-i []) (+m q0 e e e)]
6-
'accept
7-
[(-m q0 L e R) (+m qa L e R)]
8-
[(-m qa L e R) accept]
9-
'initial skip
10-
[(-m q0 L sep [C|R]) (+m q0 [sep|L] C R)]
20+
#(initial q0)
21+
' accept
22+
#(accept qa)
23+
#(if q0 then qa)
24+
' reject
25+
#(reject qr)
26+
#(if q2 then qr)
27+
#(if q3 then qr)
28+
' initial skip
29+
#(skip right on q0 , sep)
1130
'mark
12-
[(-m q0 L a [C|R]) (+m q2 [sep|L] C R)]
13-
[(-m q0 L b [C|R]) (+m q3 [sep|L] C R)]
31+
#(if a on q0 then q2 , write sep , right)
32+
#(if b on q0 then q3 , write sep , right)
1433
'skip
15-
[(-m q2 L a [C|R]) (+m q2 [a|L] C R)]
16-
[(-m q2 L sep [C|R]) (+m q2 [sep|L] C R)]
17-
[(-m q3 L b [C|R]) (+m q3 [b|L] C R)]
18-
[(-m q3 L sep [C|R]) (+m q3 [sep|L] C R)]
34+
#(skip right on q2 , a)
35+
#(skip right on q2 , sep)
36+
#(skip right on q3 , b)
37+
#(skip right on q3 , sep)
1938
'join
20-
[(-m q2 [C|L] b R) (+m q1 L C [sep|R])]
21-
[(-m q3 [C|L] a R) (+m q1 L C [sep|R])]
39+
#(if b on q2 then q1 , write sep , left)
40+
#(if a on q3 then q1 , write sep , left)
2241
'return
23-
[(-m q1 [C|L] a R) (+m q1 L C [a|R])]
24-
[(-m q1 [C|L] b R) (+m q1 L C [b|R])]
25-
[(-m q1 [C|L] sep R) (+m q1 L C [sep|R])]
26-
[(-m q1 L e [C|R]) (+m q0 [e|L] C R)]
27-
'reject
28-
[(-m q2 L e R) (+m qr L e R)]
29-
[(-m q3 L e R) (+m qr L e R)]
30-
[(-m qr L C R) reject]})
31-
32-
(show (interact @(+i [a e]) #mt))
33-
(show (interact @(+i [b e]) #mt))
34-
(show (interact @(+i [a b b e]) #mt))
35-
36-
(show (interact @(+i [e]) #mt))
37-
(show (interact @(+i [a b e]) #mt))
38-
(show (interact @(+i [a a b b e]) #mt))
39-
(show (interact @(+i [a b b a e]) #mt))
40-
(show (interact @(+i [a b a b e]) #mt))
42+
#(if a on q1 then q1 , write a , left)
43+
#(if b on q1 then q1 , write b , left)
44+
#(if sep on q1 then q1 , write sep , left)
45+
#(if e on q1 then q0 , write e , right)
46+
})
47+
48+
(:= (word W) (+i W))
49+
50+
(show (interact @#(word [a e]) #mt))
51+
(show (interact @#(word [b e]) #mt))
52+
(show (interact @#(word [a b b e]) #mt))
53+
54+
(show (interact @#(word [e]) #mt))
55+
(show (interact @#(word [a b e]) #mt))
56+
(show (interact @#(word [a a b b e]) #mt))
57+
(show (interact @#(word [a b b a e]) #mt))
58+
(show (interact @#(word [a b a b e]) #mt))

0 commit comments

Comments
 (0)