From 9570363aec35e187e2395b1760a4b94e71580ac9 Mon Sep 17 00:00:00 2001 From: "Kartik K. Agaram" Date: Wed, 29 Jul 2015 15:55:05 -0700 Subject: 1885 --- html/061channel.mu.html | 342 +++++++++++++++++++++++------------------------- 1 file changed, 163 insertions(+), 179 deletions(-) (limited to 'html/061channel.mu.html') diff --git a/html/061channel.mu.html b/html/061channel.mu.html index 913265de..89df9b83 100644 --- a/html/061channel.mu.html +++ b/html/061channel.mu.html @@ -14,14 +14,13 @@ pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background- body { font-family: monospace; color: #eeeeee; background-color: #080808; } * { font-size: 1.05em; } .muScenario { color: #00af00; } -.SalientComment { color: #00ffff; } .Delimiter { color: #a04060; } -.CommentedCode { color: #6c6c6c; } +.muRecipe { color: #ff8700; } +.SalientComment { color: #00ffff; } .Comment { color: #9090ff; } .Constant { color: #00a0a0; } .Special { color: #ff6060; } .muControl { color: #c0a020; } -.muRecipe { color: #ff8700; } --> @@ -45,12 +44,12 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } scenario channel [ run [ - 1:address:channel <- new-channel 3:literal/capacity - 1:address:channel <- write 1:address:channel, 34:literal - 2:number, 1:address:channel <- read 1:address:channel + 1:address:channel <- new-channel 3/capacity + 1:address:channel <- write 1:address:channel, 34 + 2:number, 1:address:channel <- read 1:address:channel ] memory-should-contain [ - 2 <- 34 + 2 <- 34 ] ] @@ -72,17 +71,17 @@ container channel [ # result = new channel result:address:channel <- new channel:type # result.first-full = 0 - full:address:number <- get-address result:address:channel/deref, first-full:offset - full:address:number/deref <- copy 0:literal + full:address:number <- get-address *result, first-full:offset + *full <- copy 0 # result.first-free = 0 - free:address:number <- get-address result:address:channel/deref, first-free:offset - free:address:number/deref <- copy 0:literal + free:address:number <- get-address *result, first-free:offset + *free <- copy 0 # result.data = new location[ingredient+1] capacity:number <- next-ingredient - capacity:number <- add capacity:number, 1:literal # unused slot for 'full?' below - dest:address:address:array:location <- get-address result:address:channel/deref, data:offset - dest:address:address:array:location/deref <- new location:type, capacity:number - reply result:address:channel + capacity <- add capacity, 1 # unused slot for 'full?' below + dest:address:address:array:location <- get-address *result, data:offset + *dest <- new location:type, capacity + reply result ] # chan:address:channel <- write chan:address:channel, val:location @@ -92,26 +91,26 @@ container channel [ val:location <- next-ingredient { # block if chan is full - full:boolean <- channel-full? chan:address:channel - break-unless full:boolean - full-address:address:number <- get-address chan:address:channel/deref, first-full:offset - wait-for-location full-address:address:number/deref + full:boolean <- channel-full? chan + break-unless full + full-address:address:number <- get-address *chan, first-full:offset + wait-for-location *full-address } # store val - circular-buffer:address:array:location <- get chan:address:channel/deref, data:offset - free:address:number <- get-address chan:address:channel/deref, first-free:offset - dest:address:location <- index-address circular-buffer:address:array:location/deref, free:address:number/deref - dest:address:location/deref <- copy val:location - # increment free - free:address:number/deref <- add free:address:number/deref, 1:literal + circular-buffer:address:array:location <- get *chan, data:offset + free:address:number <- get-address *chan, first-free:offset + dest:address:location <- index-address *circular-buffer, *free + *dest <- copy val + # mark its slot as filled + *free <- add *free, 1 { # wrap free around to 0 if necessary - len:number <- length circular-buffer:address:array:location/deref - at-end?:boolean <- greater-or-equal free:address:number/deref, len:number - break-unless at-end?:boolean - free:address:number/deref <- copy 0:literal + len:number <- length *circular-buffer + at-end?:boolean <- greater-or-equal *free, len + break-unless at-end? + *free <- copy 0 } - reply chan:address:channel/same-as-ingredient:0 + reply chan/same-as-ingredient:0 ] # result:location, chan:address:channel <- read chan:address:channel @@ -120,99 +119,99 @@ container channel [ chan:address:channel <- next-ingredient { # block if chan is empty - empty:boolean <- channel-empty? chan:address:channel - break-unless empty:boolean - free-address:address:number <- get-address chan:address:channel/deref, first-free:offset - wait-for-location free-address:address:number/deref + empty?:boolean <- channel-empty? chan + break-unless empty? + free-address:address:number <- get-address *chan, first-free:offset + wait-for-location *free-address } # read result - full:address:number <- get-address chan:address:channel/deref, first-full:offset - circular-buffer:address:array:location <- get chan:address:channel/deref, data:offset - result:location <- index circular-buffer:address:array:location/deref, full:address:number/deref + full:address:number <- get-address *chan, first-full:offset + circular-buffer:address:array:location <- get *chan, data:offset + result:location <- index *circular-buffer, *full # increment full - full:address:number/deref <- add full:address:number/deref, 1:literal + *full <- add *full, 1 { # wrap full around to 0 if necessary - len:number <- length circular-buffer:address:array:location/deref - at-end?:boolean <- greater-or-equal full:address:number/deref, len:number - break-unless at-end?:boolean - full:address:number/deref <- copy 0:literal + len:number <- length *circular-buffer + at-end?:boolean <- greater-or-equal *full, len + break-unless at-end? + *full <- copy 0 } - reply result:location, chan:address:channel/same-as-ingredient:0 + reply result, chan/same-as-ingredient:0 ] recipe clear-channel [ local-scope chan:address:channel <- next-ingredient { - empty?:boolean <- channel-empty? chan:address:channel - break-if empty?:boolean - _, chan:address:channel <- read chan:address:channel + empty?:boolean <- channel-empty? chan + break-if empty? + _, chan <- read chan } - reply chan:address:channel/same-as-ingredient:0 + reply chan/same-as-ingredient:0 ] scenario channel-initialization [ run [ - 1:address:channel <- new-channel 3:literal/capacity - 2:number <- get 1:address:channel/deref, first-full:offset - 3:number <- get 1:address:channel/deref, first-free:offset + 1:address:channel <- new-channel 3/capacity + 2:number <- get *1:address:channel, first-full:offset + 3:number <- get *1:address:channel, first-free:offset ] memory-should-contain [ - 2 <- 0 # first-full - 3 <- 0 # first-free + 2 <- 0 # first-full + 3 <- 0 # first-free ] ] scenario channel-write-increments-free [ run [ - 1:address:channel <- new-channel 3:literal/capacity - 1:address:channel <- write 1:address:channel, 34:literal - 2:number <- get 1:address:channel/deref, first-full:offset - 3:number <- get 1:address:channel/deref, first-free:offset + 1:address:channel <- new-channel 3/capacity + 1:address:channel <- write 1:address:channel, 34 + 2:number <- get *1:address:channel, first-full:offset + 3:number <- get *1:address:channel, first-free:offset ] memory-should-contain [ - 2 <- 0 # first-full - 3 <- 1 # first-free + 2 <- 0 # first-full + 3 <- 1 # first-free ] ] scenario channel-read-increments-full [ run [ - 1:address:channel <- new-channel 3:literal/capacity - 1:address:channel <- write 1:address:channel, 34:literal - _, 1:address:channel <- read 1:address:channel - 2:number <- get 1:address:channel/deref, first-full:offset - 3:number <- get 1:address:channel/deref, first-free:offset + 1:address:channel <- new-channel 3/capacity + 1:address:channel <- write 1:address:channel, 34 + _, 1:address:channel <- read 1:address:channel + 2:number <- get *1:address:channel, first-full:offset + 3:number <- get *1:address:channel, first-free:offset ] memory-should-contain [ - 2 <- 1 # first-full - 3 <- 1 # first-free + 2 <- 1 # first-full + 3 <- 1 # first-free ] ] scenario channel-wrap [ run [ # channel with just 1 slot - 1:address:channel <- new-channel 1:literal/capacity + 1:address:channel <- new-channel 1/capacity # write and read a value - 1:address:channel <- write 1:address:channel, 34:literal - _, 1:address:channel <- read 1:address:channel + 1:address:channel <- write 1:address:channel, 34 + _, 1:address:channel <- read 1:address:channel # first-free will now be 1 - 2:number <- get 1:address:channel/deref, first-free:offset - 3:number <- get 1:address:channel/deref, first-free:offset + 2:number <- get *1:address:channel, first-free:offset + 3:number <- get *1:address:channel, first-free:offset # write second value, verify that first-free wraps - 1:address:channel <- write 1:address:channel, 34:literal - 4:number <- get 1:address:channel/deref, first-free:offset + 1:address:channel <- write 1:address:channel, 34 + 4:number <- get *1:address:channel, first-free:offset # read second value, verify that first-full wraps - _, 1:address:channel <- read 1:address:channel - 5:number <- get 1:address:channel/deref, first-full:offset + _, 1:address:channel <- read 1:address:channel + 5:number <- get *1:address:channel, first-full:offset ] memory-should-contain [ - 2 <- 1 # first-free after first write - 3 <- 1 # first-full after first read - 4 <- 0 # first-free after second write, wrapped - 5 <- 0 # first-full after second read, wrapped + 2 <- 1 # first-free after first write + 3 <- 1 # first-full after first read + 4 <- 0 # first-free after second write, wrapped + 5 <- 0 # first-full after second read, wrapped ] ] @@ -223,10 +222,10 @@ container channel [ local-scope chan:address:channel <- next-ingredient # return chan.first-full == chan.first-free - full:number <- get chan:address:channel/deref, first-full:offset - free:number <- get chan:address:channel/deref, first-free:offset - result:boolean <- equal full:number, free:number - reply result:boolean + full:number <- get *chan, first-full:offset + free:number <- get *chan, first-free:offset + result:boolean <- equal full, free + reply result ] # A full channel has first-empty just before first-full, wasting one slot. @@ -235,79 +234,79 @@ container channel [ local-scope chan:address:channel <- next-ingredient # tmp = chan.first-free + 1 - tmp:number <- get chan:address:channel/deref, first-free:offset - tmp:number <- add tmp:number, 1:literal + tmp:number <- get *chan, first-free:offset + tmp <- add tmp, 1 { # if tmp == chan.capacity, tmp = 0 - len:number <- channel-capacity chan:address:channel - at-end?:boolean <- greater-or-equal tmp:number, len:number - break-unless at-end?:boolean - tmp:number <- copy 0:literal + len:number <- channel-capacity chan + at-end?:boolean <- greater-or-equal tmp, len + break-unless at-end? + tmp <- copy 0 } # return chan.first-full == tmp - full:number <- get chan:address:channel/deref, first-full:offset - result:boolean <- equal full:number, tmp:number - reply result:boolean + full:number <- get *chan, first-full:offset + result:boolean <- equal full, tmp + reply result ] # result:number <- channel-capacity chan:address:channel recipe channel-capacity [ local-scope chan:address:channel <- next-ingredient - q:address:array:location <- get chan:address:channel/deref, data:offset - result:number <- length q:address:array:location/deref - reply result:number + q:address:array:location <- get *chan, data:offset + result:number <- length *q + reply result ] scenario channel-new-empty-not-full [ run [ - 1:address:channel <- new-channel 3:literal/capacity - 2:boolean <- channel-empty? 1:address:channel - 3:boolean <- channel-full? 1:address:channel + 1:address:channel <- new-channel 3/capacity + 2:boolean <- channel-empty? 1:address:channel + 3:boolean <- channel-full? 1:address:channel ] memory-should-contain [ - 2 <- 1 # empty? - 3 <- 0 # full? + 2 <- 1 # empty? + 3 <- 0 # full? ] ] scenario channel-write-not-empty [ run [ - 1:address:channel <- new-channel 3:literal/capacity - 1:address:channel <- write 1:address:channel, 34:literal - 2:boolean <- channel-empty? 1:address:channel - 3:boolean <- channel-full? 1:address:channel + 1:address:channel <- new-channel 3/capacity + 1:address:channel <- write 1:address:channel, 34 + 2:boolean <- channel-empty? 1:address:channel + 3:boolean <- channel-full? 1:address:channel ] memory-should-contain [ - 2 <- 0 # empty? - 3 <- 0 # full? + 2 <- 0 # empty? + 3 <- 0 # full? ] ] scenario channel-write-full [ run [ - 1:address:channel <- new-channel 1:literal/capacity - 1:address:channel <- write 1:address:channel, 34:literal - 2:boolean <- channel-empty? 1:address:channel - 3:boolean <- channel-full? 1:address:channel + 1:address:channel <- new-channel 1/capacity + 1:address:channel <- write 1:address:channel, 34 + 2:boolean <- channel-empty? 1:address:channel + 3:boolean <- channel-full? 1:address:channel ] memory-should-contain [ - 2 <- 0 # empty? - 3 <- 1 # full? + 2 <- 0 # empty? + 3 <- 1 # full? ] ] scenario channel-read-not-full [ run [ - 1:address:channel <- new-channel 1:literal/capacity - 1:address:channel <- write 1:address:channel, 34:literal - _, 1:address:channel <- read 1:address:channel - 2:boolean <- channel-empty? 1:address:channel - 3:boolean <- channel-full? 1:address:channel + 1:address:channel <- new-channel 1/capacity + 1:address:channel <- write 1:address:channel, 34 + _, 1:address:channel <- read 1:address:channel + 2:boolean <- channel-empty? 1:address:channel + 3:boolean <- channel-full? 1:address:channel ] memory-should-contain [ - 2 <- 1 # empty? - 3 <- 0 # full? + 2 <- 1 # empty? + 3 <- 0 # full? ] ] @@ -315,105 +314,90 @@ container channel [ # out:address:channel <- buffer-lines in:address:channel, out:address:channel recipe buffer-lines [ local-scope -#? $print [buffer-lines: aaa -#? ] in:address:channel <- next-ingredient out:address:channel <- next-ingredient # repeat forever { - line:address:buffer <- new-buffer, 30:literal + line:address:buffer <- new-buffer, 30 # read characters from 'in' until newline, copy into line { +next-character - c:character, in:address:channel <- read in:address:channel + c:character, in <- read in # drop a character on backspace { # special-case: if it's a backspace - backspace?:boolean <- equal c:character, 8:literal - break-unless backspace?:boolean + backspace?:boolean <- equal c, 8 + break-unless backspace? # drop previous character -#? close-console #? 2 -#? $print [backspace! -#? ] #? 1 { - buffer-length:address:number <- get-address line:address:buffer/deref, length:offset - buffer-empty?:boolean <- equal buffer-length:address:number/deref, 0:literal - break-if buffer-empty?:boolean -#? $print [before: ], buffer-length:address:number/deref, 10:literal/newline - buffer-length:address:number/deref <- subtract buffer-length:address:number/deref, 1:literal -#? $print [after: ], buffer-length:address:number/deref, 10:literal/newline + buffer-length:address:number <- get-address *line, length:offset + buffer-empty?:boolean <- equal *buffer-length, 0 + break-if buffer-empty? + *buffer-length <- subtract *buffer-length, 1 } -#? $exit #? 2 # and don't append this one loop +next-character:label } # append anything else -#? $print [buffer-lines: appending ], c:character, 10:literal/newline - line:address:buffer <- buffer-append line:address:buffer, c:character - line-done?:boolean <- equal c:character, 10:literal/newline - break-if line-done?:boolean + line <- buffer-append line, c + line-done?:boolean <- equal c, 10/newline + break-if line-done? # stop buffering on eof (currently only generated by fake console) - eof?:boolean <- equal c:character, 0:literal/eof - break-if eof?:boolean + eof?:boolean <- equal c, 0/eof + break-if eof? loop } -#? close-console #? 1 # copy line into 'out' -#? $print [buffer-lines: emitting -#? ] - i:number <- copy 0:literal - line-contents:address:array:character <- get line:address:buffer/deref, data:offset - max:number <- get line:address:buffer/deref, length:offset + i:number <- copy 0 + line-contents:address:array:character <- get *line, data:offset + max:number <- get *line, length:offset { - done?:boolean <- greater-or-equal i:number, max:number - break-if done?:boolean - c:character <- index line-contents:address:array:character/deref, i:number - out:address:channel <- write out:address:channel, c:character -#? $print [writing ], i:number, [: ], c:character, 10:literal/newline - i:number <- add i:number, 1:literal + done?:boolean <- greater-or-equal i, max + break-if done? + c:character <- index *line-contents, i + out <- write out, c + i <- add i, 1 loop } -#? $dump-trace #? 1 -#? $exit #? 1 loop } - reply out:address:channel/same-as-ingredient:1 + reply out/same-as-ingredient:1 ] scenario buffer-lines-blocks-until-newline [ run [ - 1:address:channel/stdin <- new-channel 10:literal/capacity - 2:address:channel/buffered-stdin <- new-channel 10:literal/capacity - 3:boolean <- channel-empty? 2:address:channel/buffered-stdin - assert 3:boolean, [ + 1:address:channel/stdin <- new-channel 10/capacity + 2:address:channel/buffered-stdin <- new-channel 10/capacity + 3:boolean <- channel-empty? 2:address:channel/buffered-stdin + assert 3:boolean, [ F buffer-lines-blocks-until-newline: channel should be empty after init] # buffer stdin into buffered-stdin, try to read from buffered-stdin - 4:number/buffer-routine <- start-running buffer-lines:recipe, 1:address:channel/stdin, 2:address:channel/buffered-stdin - wait-for-routine 4:number/buffer-routine - 5:boolean <- channel-empty? 2:address:channel/buffered-stdin - assert 5:boolean, [ + 4:number/buffer-routine <- start-running buffer-lines:recipe, 1:address:channel/stdin, 2:address:channel/buffered-stdin + wait-for-routine 4:number/buffer-routine + 5:boolean <- channel-empty? 2:address:channel/buffered-stdin + assert 5:boolean, [ F buffer-lines-blocks-until-newline: channel should be empty after buffer-lines bring-up] # write 'a' - 1:address:channel <- write 1:address:channel, 97:literal/a - restart 4:number/buffer-routine - wait-for-routine 4:number/buffer-routine - 6:boolean <- channel-empty? 2:address:channel/buffered-stdin - assert 6:boolean, [ + 1:address:channel <- write 1:address:channel, 97/a + restart 4:number/buffer-routine + wait-for-routine 4:number/buffer-routine + 6:boolean <- channel-empty? 2:address:channel/buffered-stdin + assert 6:boolean, [ F buffer-lines-blocks-until-newline: channel should be empty after writing 'a'] # write 'b' - 1:address:channel <- write 1:address:channel, 98:literal/b - restart 4:number/buffer-routine - wait-for-routine 4:number/buffer-routine - 7:boolean <- channel-empty? 2:address:channel/buffered-stdin - assert 7:boolean, [ + 1:address:channel <- write 1:address:channel, 98/b + restart 4:number/buffer-routine + wait-for-routine 4:number/buffer-routine + 7:boolean <- channel-empty? 2:address:channel/buffered-stdin + assert 7:boolean, [ F buffer-lines-blocks-until-newline: channel should be empty after writing 'b'] # write newline - 1:address:channel <- write 1:address:channel, 10:literal/newline - restart 4:number/buffer-routine - wait-for-routine 4:number/buffer-routine - 8:boolean <- channel-empty? 2:address:channel/buffered-stdin - 9:boolean/completed? <- not 8:boolean - assert 9:boolean/completed?, [ + 1:address:channel <- write 1:address:channel, 10/newline + restart 4:number/buffer-routine + wait-for-routine 4:number/buffer-routine + 8:boolean <- channel-empty? 2:address:channel/buffered-stdin + 9:boolean/completed? <- not 8:boolean + assert 9:boolean/completed?, [ F buffer-lines-blocks-until-newline: channel should contain data after writing newline] trace [test], [reached end] ] -- cgit 1.4.1-2-gfad0