From 54e5e35bbed061cd06433c203a42a8ef805e82dd Mon Sep 17 00:00:00 2001 From: Brent Yorgey Date: Sat, 11 Jun 2022 15:15:07 -0500 Subject: [PATCH] clean up examples Closes #325. --- example/BFS-clear.sw | 4 ++++ example/cat.sw | 3 +++ example/dfs.sw | 13 +++++++++++++ example/fact.sw | 12 +++++++++--- example/rep.sw | 7 ------- example/square.sw | 12 ------------ example/wander.sw | 19 ++++++++++++------- example/zigzag.sw | 19 ------------------- 8 files changed, 41 insertions(+), 48 deletions(-) create mode 100644 example/dfs.sw delete mode 100644 example/rep.sw delete mode 100644 example/square.sw delete mode 100644 example/zigzag.sw diff --git a/example/BFS-clear.sw b/example/BFS-clear.sw index 484f15c3..7e22f164 100644 --- a/example/BFS-clear.sw +++ b/example/BFS-clear.sw @@ -1,3 +1,7 @@ +// Quickly harvesting an entire forest in parallel using breadth-first +// search, with robots spawning more robots. Fun, though not very practical +// in classic mode. + def repeat : int -> cmd () -> cmd () = \n.\c. if (n == 0) {} diff --git a/example/cat.sw b/example/cat.sw index f23aabd8..67f352ac 100644 --- a/example/cat.sw +++ b/example/cat.sw @@ -1,3 +1,6 @@ +// A "cat" that wanders around randomly. Shows off use of the +// 'random' command. + let forever : cmd () -> cmd () = \c. c ; forever c in let repeat : int -> cmd () -> cmd () = \n. \c. if (n == 0) {} {c ; repeat (n-1) c} in diff --git a/example/dfs.sw b/example/dfs.sw new file mode 100644 index 00000000..71d62043 --- /dev/null +++ b/example/dfs.sw @@ -0,0 +1,13 @@ +def ifC : forall a. cmd bool -> {cmd a} -> {cmd a} -> cmd a = + \test. \thn. \els. b <- test; if b thn els end + +// Recursive DFS to harvest a contiguous forest +def dfs : cmd () = + ifC (ishere "tree") { + grab; + turn west; + ifC blocked {} {move; dfs; turn east; move}; + turn north; + ifC blocked {} {move; dfs; turn south; move}; + } {} +end diff --git a/example/fact.sw b/example/fact.sw index 7a47f2b8..65266dc8 100644 --- a/example/fact.sw +++ b/example/fact.sw @@ -1,7 +1,13 @@ -let repeat : int -> cmd () -> cmd () = \n.\c. +// Defining simple recursive functions. + +def repeat : int -> cmd () -> cmd () = \n.\c. if (n == 0) {} {c ; repeat (n-1) c} -in let fact : int -> int = \n:int. +end + +def fact : int -> int = \n:int. if (n == 0) {1} {n * fact (n-1)} -in move; move; repeat (fact 4) move +end + +def gofar = repeat (fact 4) move end diff --git a/example/rep.sw b/example/rep.sw deleted file mode 100644 index ddf58e08..00000000 --- a/example/rep.sw +++ /dev/null @@ -1,7 +0,0 @@ -let rep : int -> cmd () -> cmd () = - \n.\c. - if (n == 0) - {} - {c ; rep (n-1) c} -in - rep 10 move diff --git a/example/square.sw b/example/square.sw deleted file mode 100644 index 82d153b4..00000000 --- a/example/square.sw +++ /dev/null @@ -1,12 +0,0 @@ -let rep : int -> cmd () -> cmd () = - \n.\c. - if (n == 0) - {} - {c ; rep (n-1) c} -in -rep 4 ( - rep 10 move; - turn left; - build {run("square.sw")}; - return () -) diff --git a/example/wander.sw b/example/wander.sw index a8d5fb21..f15e3a0f 100644 --- a/example/wander.sw +++ b/example/wander.sw @@ -1,7 +1,12 @@ -let forever : cmd () -> cmd () = - \c. c ; forever c in -forever ( - b <- random 2; - turn (if (b == 0) {left} {right}); - move -) +def forever : {cmd ()} -> cmd () = + \c. force c ; forever c +end + +// Wander randomly forever. +def wander : cmd () = + forever { + b <- random 2; + turn (if (b == 0) {left} {right}); + move + } +end diff --git a/example/zigzag.sw b/example/zigzag.sw deleted file mode 100644 index 784f1b42..00000000 --- a/example/zigzag.sw +++ /dev/null @@ -1,19 +0,0 @@ -let rep : int -> cmd () -> cmd () = \n. \c. - if (n == 0) - {} - { c; rep (n-1) c } -in -turn east; -rep 50 ( - grab; move; - turn left; - grab; move; - turn right; - p <- whereami; - let y = snd p in - if (y >= 10) { - turn right - } { - if (y <= 0) { turn left } {} - } -)