about summary refs log tree commit diff stats
path: root/channel.mu
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2015-05-05 21:17:24 -0700
committerKartik K. Agaram <vc@akkartik.com>2015-05-05 21:17:24 -0700
commitb96af395b9af2ff9df94b3e82213171f30827c8d (patch)
tree17c8c12648ccc25625e2534ec8d74fbe8f1542cc /channel.mu
parent2e3b597fe85b654e82b891c22d50754fa5a26156 (diff)
downloadmu-b96af395b9af2ff9df94b3e82213171f30827c8d.tar.gz
1276 - make C++ version the default
I've tried to update the Readme, but there are at least a couple of issues.
Diffstat (limited to 'channel.mu')
-rw-r--r--channel.mu84
1 files changed, 39 insertions, 45 deletions
diff --git a/channel.mu b/channel.mu
index 61151833..c20fa804 100644
--- a/channel.mu
+++ b/channel.mu
@@ -1,49 +1,43 @@
-(function producer [
-  ; produce numbers 1 to 5 on a channel
-  (default-space:space-address <- new space:literal 30:literal)
-  (chan:channel-address <- next-input)
-  ; n = 0
-  (n:integer <- copy 0:literal)
-  { begin
-    (done?:boolean <- less-than n:integer 5:literal)
-    (break-unless done?:boolean)
-    ; other threads might get between these prints
-    ($print (("produce: " literal)))
-    (print-integer nil:literal/terminal n:integer)
-    ($print (("\n" literal)))
-    ; 'box' n into a dynamically typed 'tagged value' because that's what
-    ; channels take
-    (n2:integer <- copy n:integer)
-    (n3:tagged-value-address <- init-tagged-value integer:literal n2:integer)
-    (chan:channel-address/deref <- write chan:channel-address n3:tagged-value-address/deref)
-    (n:integer <- add n:integer 1:literal)
-    (loop)
+recipe producer [
+  # produce numbers 1 to 5 on a channel
+  default-space:address:array:location <- new location:type, 30:literal
+  chan:address:channel <- next-ingredient
+  # n = 0
+  n:integer <- copy 0:literal
+  {
+    done?:boolean <- lesser-than n:integer, 5:literal
+    break-unless done?:boolean
+    # other threads might get between these prints
+    $print [produce: ]
+    $print n:integer
+    $print [
+]
+    chan:address:channel <- write chan:address:channel, n:integer
+    n:integer <- add n:integer, 1:literal
+    loop
   }
-])
+]
 
-(function consumer [
-  ; consume and print integers from a channel
-  (default-space:space-address <- new space:literal 30:literal)
-  (chan:channel-address <- next-input)
-  { begin
-    ; read a tagged value from the channel
-    (x:tagged-value chan:channel-address/deref <- read chan:channel-address)
-    ; unbox the tagged value into an integer
-    (n2:integer <- maybe-coerce x:tagged-value integer:literal)
-    ; other threads might get between these prints
-    ($print (("consume: " literal)))
-    (print-integer nil:literal/terminal n2:integer)
-    ($print (("\n" literal)))
-    (loop)
+recipe consumer [
+  # consume and print integers from a channel
+  default-space:address:array:location <- new location:type, 30:literal
+  chan:address:channel <- next-ingredient
+  {
+    # read an integer from the channel
+    n:integer, chan:address:channel <- read chan:address:channel
+    # other threads might get between these prints
+    $print [consume: ]
+    $print n:integer
+    $print [
+]
+    loop
   }
-])
+]
 
-(function main [
-  (default-space:space-address <- new space:literal 30:literal)
-  (chan:channel-address <- init-channel 3:literal)
-  ; create two background 'routines' that communicate by a channel
-  (routine1:integer <- fork consumer:fn nil:literal/globals nil:literal/limit chan:channel-address)
-  (routine2:integer <- fork producer:fn nil:literal/globals nil:literal/limit chan:channel-address)
-  (sleep until-routine-done:literal routine1:integer)
-  (sleep until-routine-done:literal routine2:integer)
-])
+recipe main [
+  default-space:address:array:location <- new location:type, 30:literal
+  chan:address:channel <- init-channel 3:literal
+  # create two background 'routines' that communicate by a channel
+  routine1:integer <- start-running consumer:recipe, chan:address:channel
+  routine2:integer <- start-running producer:recipe, chan:address:channel
+]