about summary refs log tree commit diff stats
path: root/archive/2.vm/same-fringe.mu
diff options
context:
space:
mode:
authorKartik Agaram <vc@akkartik.com>2020-01-01 17:04:37 -0800
committerKartik Agaram <vc@akkartik.com>2020-01-01 17:04:37 -0800
commit2a4088119cf41175457414dfa59bd4064b8f0562 (patch)
tree64fe184e399f9870ebd481a90eec34d51e5dff68 /archive/2.vm/same-fringe.mu
parent23fd294d85959c6b476bcdc35ed6ad508cc99b8f (diff)
downloadmu-2a4088119cf41175457414dfa59bd4064b8f0562.tar.gz
5852
Diffstat (limited to 'archive/2.vm/same-fringe.mu')
-rw-r--r--archive/2.vm/same-fringe.mu89
1 files changed, 0 insertions, 89 deletions
diff --git a/archive/2.vm/same-fringe.mu b/archive/2.vm/same-fringe.mu
deleted file mode 100644
index b9235006..00000000
--- a/archive/2.vm/same-fringe.mu
+++ /dev/null
@@ -1,89 +0,0 @@
-# The 'same fringe' problem: http://wiki.c2.com/?SameFringeProblem
-# Example program demonstrating coroutines using Mu's delimited continuations.
-#
-# Expected output:
-#   1
-# (i.e. that the two given trees x and y have the same leaves, in the same
-# order from left to right)
-
-container tree:_elem [
-  val:_elem
-  left:&:tree:_elem
-  right:&:tree:_elem
-]
-
-def main [
-  local-scope
-  # x: ((a b) c)
-  # y: (a (b c))
-  a:&:tree:num <- new-tree 3
-  b:&:tree:num <- new-tree 4
-  c:&:tree:num <- new-tree 5
-  x1:&:tree:num <- new-tree a, b
-  x:&:tree:num <- new-tree x1, c
-  y1:&:tree:num <- new-tree b, c
-  y:&:tree:num <- new-tree a, y1
-  result:bool <- same-fringe x, y
-  $print result 10/newline
-]
-
-def same-fringe a:&:tree:_elem, b:&:tree:_elem -> result:bool [
-  local-scope
-  load-inputs
-  k1:continuation <- call-with-continuation-mark 100/mark, process, a
-  k2:continuation <- call-with-continuation-mark 100/mark, process, b
-  {
-    k1, x:_elem, a-done?:bool <- call k1
-    k2, y:_elem, b-done?:bool <- call k2
-    break-if a-done?
-    break-if b-done?
-    match?:bool <- equal x, y
-    return-unless match?, false
-    loop
-  }
-  result <- and a-done?, b-done?
-]
-
-# harness around traversal
-def process t:&:tree:_elem [
-  local-scope
-  load-inputs
-  return-continuation-until-mark 100/mark  # initial
-  traverse t
-  zero-val:&:_elem <- new _elem:type
-  return-continuation-until-mark 100/mark, *zero-val, true/done  # final
-  assert false, [continuation called past done]
-]
-
-# core traversal
-def traverse t:&:tree:_elem [
-  local-scope
-  load-inputs
-  return-unless t
-  l:&:tree:_elem <- get *t, left:offset
-  traverse l
-  r:&:tree:_elem <- get *t, right:offset
-  traverse r
-  return-if l
-  return-if r
-  # leaf
-  v:_elem <- get *t, val:offset
-  return-continuation-until-mark 100/mark, v, false/not-done
-]
-
-# details
-
-def new-tree x:_elem -> result:&:tree:_elem [
-  local-scope
-  load-inputs
-  result <- new {(tree _elem): type}
-  put *result, val:offset, x
-]
-
-def new-tree l:&:tree:_elem, r:&:tree:_elem -> result:&:tree:_elem [
-  local-scope
-  load-inputs
-  result <- new {(tree _elem): type}
-  put *result, left:offset, l
-  put *result, right:offset, r
-]