about summary refs log tree commit diff stats
path: root/arc/counters.mu
blob: 0e4145131104963cfea960374db5433031e6cb76 (plain) (blame)
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
(function init-counter [
  (default-space:space-address <- new space:literal 30:literal)
  (n:integer <- next-input)
  (reply default-space:space-address)
 ])

(function increment-counter [
  (default-space:space-address <- new space:literal 30:literal)
  (0:space-address/names:init-counter <- next-input)  ; setup outer space; it *must* come from 'init-counter'
  (x:integer <- next-input)
  (n:integer/space:1 <- add n:integer/space:1 x:integer)
  (reply n:integer/space:1)
 ])

(function main [
  (default-space:space-address <- new space:literal 30:literal)
  ; counter A
  (a:space-address <- init-counter 34:literal)
  ; counter B
  (b:space-address <- init-counter 23:literal)
  ; increment both by 2 but in different ways
  (increment-counter a:space-address 1:literal)
  (bres:integer <- increment-counter b:space-address 2:literal)
  (ares:integer <- increment-counter a:space-address 1:literal)
  ; check results
  ($print (("Contents of counters a: " literal)))
  (print-integer nil:literal/terminal ares:integer)
  ($print ((" b: " literal)))
  (print-integer nil:literal/terminal bres:integer)
  ($print (("\n" literal)))
 ])

; compare http://www.paulgraham.com/accgen.html
n>space:literal 30:literal) (cursor-mode) ; hook up stdin (stdin:channel-address <- init-channel 1:literal) ;? ($print (("main: stdin is " literal))) ;? ($print stdin:channel-address) ;? ($print (("\n" literal))) (fork-helper send-keys-to-stdin:fn nil:literal/globals nil:literal/limit nil:literal/keyboard stdin:channel-address) ; now read characters from stdin until a 'q' is typed ($print (("? " literal))) { begin (x:tagged-value stdin:channel-address/deref <- read stdin:channel-address) (c:character <- maybe-coerce x:tagged-value character:literal) ;? ($print (("main: stdin is " literal))) ;? ($print stdin:channel-address) ;? ($print (("\n" literal))) ;? ($print (("check: " literal))) ;? ($print c:character) (done?:boolean <- equal c:character ((#\q literal))) (break-if done?:boolean) (loop) } ])