diff options
Diffstat (limited to 'html/repl.mu.html')
-rw-r--r-- | html/repl.mu.html | 876 |
1 files changed, 0 insertions, 876 deletions
diff --git a/html/repl.mu.html b/html/repl.mu.html deleted file mode 100644 index 4a0f2c21..00000000 --- a/html/repl.mu.html +++ /dev/null @@ -1,876 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> -<html> -<head> -<meta http-equiv="content-type" content="text/html; charset=UTF-8"> -<title>Mu - repl.mu</title> -<meta name="Generator" content="Vim/7.4"> -<meta name="plugin-version" content="vim7.4_v1"> -<meta name="syntax" content="none"> -<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,prevent_copy="> -<meta name="colorscheme" content="minimal"> -<style type="text/css"> -<!-- -pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-color: #080808; } -body { font-family: monospace; color: #eeeeee; background-color: #080808; } -* { font-size: 1.05em; } -.muScenario { color: #00af00; } -.Delimiter { color: #a04060; } -.Comment { color: #9090ff; } -.Constant { color: #00a0a0; } -.Special { color: #ff6060; } -.CommentedCode { color: #6c6c6c; } -.muControl { color: #c0a020; } -.muRecipe { color: #ff8700; } ---> -</style> - -<script type='text/javascript'> -<!-- - ---> -</script> -</head> -<body> -<pre id='vimCodeElement'> -<span class="Comment"># interactive prompt for mu</span> - -<span class="muRecipe">recipe</span> main [ - <span class="Constant">default-space</span>:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span> - open-console - msg:address:array:character<span class="Special"> <- </span>new <span class="Constant">[ready! type in an instruction, then hit enter. ctrl-d exits.</span> -<span class="Constant">]</span> - <span class="Constant">0:literal/real-screen</span><span class="Special"> <- </span>print-string <span class="Constant">0:literal/real-screen</span>, msg:address:array:character, <span class="Constant">245:literal/grey</span> - <span class="Constant">0:literal/real-console</span>, <span class="Constant">0:literal/real-screen</span><span class="Special"> <- </span>color-session <span class="Constant">0:literal/real-console</span>, <span class="Constant">0:literal/real-screen</span> - close-console -] - -<span class="muRecipe">recipe</span> color-session [ - <span class="Constant">default-space</span>:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span> - console:address<span class="Special"> <- </span><span class="Constant">next-ingredient</span> - screen:address<span class="Special"> <- </span><span class="Constant">next-ingredient</span> - <span class="Delimiter">{</span> - inst:address:array:character, console:address, screen:address<span class="Special"> <- </span>read-instruction console:address, screen:address - <span class="muControl">break-unless</span> inst:address:array:character - run-interactive inst:address:array:character - <span class="muControl">loop</span> - <span class="Delimiter">}</span> - <span class="muControl">reply</span> console:address/same-as-ingredient:0, screen:address/same-as-ingredient:1 -] - -<span class="Comment"># basic console input; just text and enter</span> -<span class="muScenario">scenario</span> read-instruction1 [ - assume-screen <span class="Constant">30:literal/width</span>, <span class="Constant">5:literal/height</span> - assume-console [ - type <span class="Constant">[x <- copy y</span> -<span class="Constant">]</span> - ] - run [ - 1:address:array:character<span class="Special"> <- </span>read-instruction console:address, screen:address - 2:address:array:character<span class="Special"> <- </span>new <span class="Constant">[=> ]</span> - print-string screen:address, 2:address:array:character - print-string screen:address, 1:address:array:character - ] - screen-should-contain [ - <span class="Constant"> .x <- copy y .</span> - <span class="Constant"> .=> x <- copy y .</span> - <span class="Constant"> . .</span> - ] - screen-should-contain-in-color <span class="Constant">7:literal/white</span>, [ - <span class="Constant"> .x copy y .</span> - <span class="Constant"> .=> x <- copy y .</span> - <span class="Constant"> . .</span> - ] - screen-should-contain-in-color <span class="Constant">1:literal/red</span>, [ - <span class="Constant"> . <- .</span> - <span class="Constant"> . .</span> - ] -] - -<span class="Comment"># Read characters as they're typed at the console, print them to the screen,</span> -<span class="Comment"># accumulate them in a string, return the string at the end.</span> -<span class="Comment"># Most of the complexity is for the printing to screen, to highlight strings</span> -<span class="Comment"># and comments specially. Especially in the presence of backspacing.</span> -<span class="muRecipe">recipe</span> read-instruction [ - <span class="Constant">default-space</span>:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">60:literal</span> - console:address<span class="Special"> <- </span><span class="Constant">next-ingredient</span> - screen:address<span class="Special"> <- </span><span class="Constant">next-ingredient</span> - result:address:buffer<span class="Special"> <- </span>new-buffer <span class="Constant">10:literal</span> <span class="Comment"># string to maybe add to</span> - trace <span class="Constant">[app]</span>, <span class="Constant">[read-instruction]</span> - <span class="Comment"># start state machine by calling slurp-regular-characters, which will return</span> - <span class="Comment"># by calling the complete continuation</span> - complete:continuation<span class="Special"> <- </span><span class="muControl">current-continuation</span> - <span class="Comment"># If result is not empty, we've run slurp-regular-characters below, called</span> - <span class="Comment"># the continuation and so bounced back here. We're done.</span> - len:number<span class="Special"> <- </span>get result:address:buffer/deref, length:offset - completed?:boolean<span class="Special"> <- </span>greater-than len:number, <span class="Constant">0:literal</span> - <span class="muControl">jump-if</span> completed?:boolean, <span class="Constant">+completed:label</span> - <span class="Comment"># Otherwise we're just getting started.</span> - result:address:buffer, console:address, screen:address<span class="Special"> <- </span>slurp-regular-characters result:address:buffer, console:address, screen:address, complete:continuation -<span class="CommentedCode">#? $print [aaa: ], result:address:buffer #? 1</span> -<span class="CommentedCode">#? move-cursor-down-on-display #? 1</span> - trace <span class="Constant">[error]</span>, <span class="Constant">[slurp-regular-characters should never return normally]</span> -<span class="Constant"> +completed</span> - result2:address:array:character<span class="Special"> <- </span>buffer-to-array result:address:buffer -<span class="CommentedCode">#? $print [bbb: ], result2:address:array:character #? 1</span> -<span class="CommentedCode">#? move-cursor-down-on-display #? 1</span> - trace <span class="Constant">[app]</span>, <span class="Constant">[exiting read-instruction]</span> - <span class="muControl">reply</span> result2:address:array:character, console:address/same-as-ingredient:0, screen:address/same-as-ingredient:1 -] - -<span class="Comment"># read characters from the console, print them to the screen in *white*.</span> -<span class="Comment"># Transition to other routines for comments and strings.</span> -<span class="muRecipe">recipe</span> slurp-regular-characters [ - <span class="Constant">default-space</span>:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span> - result:address:buffer<span class="Special"> <- </span><span class="Constant">next-ingredient</span> - console:address<span class="Special"> <- </span><span class="Constant">next-ingredient</span> - screen:address<span class="Special"> <- </span><span class="Constant">next-ingredient</span> - complete:continuation<span class="Special"> <- </span><span class="Constant">next-ingredient</span> - trace <span class="Constant">[app]</span>, <span class="Constant">[slurp-regular-characters]</span> - characters-slurped:number<span class="Special"> <- </span>copy <span class="Constant">0:literal</span> -<span class="CommentedCode">#? $run-depth #? 1</span> - <span class="Delimiter">{</span> -<span class="Constant"> +next-character</span> - trace <span class="Constant">[app]</span>, <span class="Constant">[slurp-regular-characters: next]</span> -<span class="CommentedCode">#? $print [a0 #? 1</span> -<span class="CommentedCode">#? ] #? 1</span> -<span class="CommentedCode">#? move-cursor-down-on-display #? 1</span> - <span class="Comment"># read character</span> - c:character, console:address found?:boolean<span class="Special"> <- </span>read-key console:address - <span class="muControl">loop-unless</span> found?:boolean <span class="Constant">+next-character:label</span> -<span class="CommentedCode">#? print-character screen:address, c:character #? 1</span> -<span class="CommentedCode">#? move-cursor-down-on-display #? 1</span> - <span class="Comment"># quit?</span> - <span class="Delimiter">{</span> -<span class="CommentedCode">#? $print [aaa] #? 1</span> -<span class="CommentedCode">#? move-cursor-down-on-display #? 1</span> - ctrl-d?:boolean<span class="Special"> <- </span>equal c:character, <span class="Constant">4:literal/ctrl-d/eof</span> - <span class="muControl">break-unless</span> ctrl-d?:boolean -<span class="CommentedCode">#? $print [ctrl-d] #? 1</span> -<span class="CommentedCode">#? move-cursor-down-on-display #? 1</span> - trace <span class="Constant">[app]</span>, <span class="Constant">[slurp-regular-characters: ctrl-d]</span> - <span class="muControl">reply</span> <span class="Constant">0:literal</span>, console:address/same-as-ingredient:1, screen:address/same-as-ingredient:2 - <span class="Delimiter">}</span> - <span class="Delimiter">{</span> - null?:boolean<span class="Special"> <- </span>equal c:character, <span class="Constant">0:literal/null</span> - <span class="muControl">break-unless</span> null?:boolean - trace <span class="Constant">[app]</span>, <span class="Constant">[slurp-regular-characters: null]</span> - <span class="muControl">reply</span> <span class="Constant">0:literal</span>, console:address/same-as-ingredient:1, screen:address/same-as-ingredient:2 - <span class="Delimiter">}</span> - <span class="Comment"># comment?</span> - <span class="Delimiter">{</span> - comment?:boolean<span class="Special"> <- </span>equal c:character, <span class="Constant">35:literal/hash</span> - <span class="muControl">break-unless</span> comment?:boolean - print-character screen:address, c:character, <span class="Constant">4:literal/blue</span> - result:address:buffer<span class="Special"> <- </span>buffer-append result:address:buffer, c:character - result:address:buffer, console:address, screen:address<span class="Special"> <- </span>slurp-comment result:address:buffer, console:address, screen:address, complete:continuation - <span class="Comment"># continue appending to this instruction, whether comment ended or was backspaced out of</span> - <span class="muControl">loop</span> <span class="Constant">+next-character:label</span> - <span class="Delimiter">}</span> - <span class="Comment"># string</span> - <span class="Delimiter">{</span> - string?:boolean<span class="Special"> <- </span>equal c:character, <span class="Constant">91:literal/open-bracket</span> - <span class="muControl">break-unless</span> string?:boolean - print-character screen:address, c:character, <span class="Constant">6:literal/cyan</span> - result:address:buffer<span class="Special"> <- </span>buffer-append result:address:buffer, c:character - result:address:buffer, _, console:address, screen:address<span class="Special"> <- </span>slurp-string result:address:buffer, console:address, screen:address, complete:continuation - <span class="muControl">loop</span> <span class="Constant">+next-character:label</span> - <span class="Delimiter">}</span> - <span class="Comment"># assignment</span> - <span class="Delimiter">{</span> - assign?:boolean<span class="Special"> <- </span>equal c:character, <span class="Constant">60:literal/less-than</span> - <span class="muControl">break-unless</span> assign?:boolean - print-character screen:address, c:character, <span class="Constant">1:literal/red</span> - trace <span class="Constant">[app]</span>, <span class="Constant">[start of assignment: <]</span> - result:address:buffer<span class="Special"> <- </span>buffer-append result:address:buffer, c:character - result:address:buffer, console:address, screen:address<span class="Special"> <- </span>slurp-assignment result:address:buffer, console:address, screen:address, complete:continuation - <span class="muControl">loop</span> <span class="Constant">+next-character:label</span> - <span class="Delimiter">}</span> - <span class="Comment"># print</span> - print-character screen:address, c:character <span class="Comment"># default color</span> - <span class="Comment"># append</span> - result:address:buffer<span class="Special"> <- </span>buffer-append result:address:buffer, c:character -<span class="CommentedCode">#? $print [a1 #? 1</span> -<span class="CommentedCode">#? ] #? 1</span> -<span class="CommentedCode">#? move-cursor-down-on-display #? 1</span> - <span class="Comment"># backspace? decrement and maybe return</span> - <span class="Delimiter">{</span> -<span class="CommentedCode">#? $print [a2 #? 1</span> -<span class="CommentedCode">#? ] #? 1</span> -<span class="CommentedCode">#? move-cursor-down-on-display #? 1</span> - backspace?:boolean<span class="Special"> <- </span>equal c:character, <span class="Constant">8:literal/backspace</span> - <span class="muControl">break-unless</span> backspace?:boolean -<span class="CommentedCode">#? $print [a3 #? 1</span> -<span class="CommentedCode">#? ] #? 1</span> -<span class="CommentedCode">#? move-cursor-down-on-display #? 1</span> - characters-slurped:number<span class="Special"> <- </span>subtract characters-slurped:number, <span class="Constant">1:literal</span> - <span class="Delimiter">{</span> -<span class="CommentedCode">#? $print [a4 #? 1</span> -<span class="CommentedCode">#? ] #? 1</span> -<span class="CommentedCode">#? move-cursor-down-on-display #? 1</span> - done?:boolean<span class="Special"> <- </span>lesser-or-equal characters-slurped:number, <span class="Constant">-1:literal</span> - <span class="muControl">break-unless</span> done?:boolean -<span class="CommentedCode">#? $print [a5 #? 1</span> -<span class="CommentedCode">#? ] #? 1</span> -<span class="CommentedCode">#? move-cursor-down-on-display #? 1</span> - trace <span class="Constant">[app]</span>, <span class="Constant">[slurp-regular-characters: too many backspaces; returning]</span> -<span class="CommentedCode">#? $print [a6 #? 1</span> -<span class="CommentedCode">#? ] #? 1</span> -<span class="CommentedCode">#? move-cursor-down-on-display #? 1</span> - <span class="muControl">reply</span> result:address:buffer, console:address/same-as-ingredient:1, screen:address/same-as-ingredient:2 - <span class="Delimiter">}</span> - <span class="muControl">loop</span> <span class="Constant">+next-character:label</span> - <span class="Delimiter">}</span> -<span class="CommentedCode">#? $print [a9 #? 1</span> -<span class="CommentedCode">#? ] #? 1</span> -<span class="CommentedCode">#? move-cursor-down-on-display #? 1</span> - <span class="Comment"># otherwise increment</span> - characters-slurped:number<span class="Special"> <- </span>add characters-slurped:number, <span class="Constant">1:literal</span> - <span class="Comment"># done with this instruction?</span> - done?:boolean<span class="Special"> <- </span>equal c:character, <span class="Constant">10:literal/newline</span> - <span class="muControl">break-if</span> done?:boolean - <span class="muControl">loop</span> - <span class="Delimiter">}</span> - <span class="Comment"># newline encountered; terminate all recursive calls</span> -<span class="CommentedCode">#? xx:address:array:character <- new [completing!] #? 1</span> -<span class="CommentedCode">#? print-string screen:address, xx:address:array:character #? 1</span> - trace <span class="Constant">[app]</span>, <span class="Constant">[slurp-regular-characters: newline encountered; unwinding stack]</span> - <span class="muControl">continue-from</span> complete:continuation -] - -<span class="Comment"># read characters from console, print them to screen in the comment color.</span> -<span class="Comment">#</span> -<span class="Comment"># Simpler version of slurp-regular-characters; doesn't handle comments or</span> -<span class="Comment"># strings. Tracks an extra count in case we backspace out of it</span> -<span class="muRecipe">recipe</span> slurp-comment [ - <span class="Constant">default-space</span>:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span> - result:address:buffer<span class="Special"> <- </span><span class="Constant">next-ingredient</span> - console:address<span class="Special"> <- </span><span class="Constant">next-ingredient</span> - screen:address<span class="Special"> <- </span><span class="Constant">next-ingredient</span> - complete:continuation<span class="Special"> <- </span><span class="Constant">next-ingredient</span> - trace <span class="Constant">[app]</span>, <span class="Constant">[slurp-comment]</span> - <span class="Comment"># use this to track when backspace should reset color</span> - characters-slurped:number<span class="Special"> <- </span>copy <span class="Constant">1:literal</span> <span class="Comment"># for the initial '#' that's already appended to result</span> - <span class="Delimiter">{</span> -<span class="Constant"> +next-character</span> - <span class="Comment"># read character</span> - c:character, console:address, found?:boolean<span class="Special"> <- </span>read-key console:address - <span class="muControl">loop-unless</span> found?:boolean <span class="Constant">+next-character:label</span> - <span class="Comment"># quit?</span> - <span class="Delimiter">{</span> - ctrl-d?:boolean<span class="Special"> <- </span>equal c:character, <span class="Constant">4:literal/ctrl-d/eof</span> - <span class="muControl">break-unless</span> ctrl-d?:boolean - trace <span class="Constant">[app]</span>, <span class="Constant">[slurp-comment: ctrl-d]</span> - <span class="muControl">reply</span> <span class="Constant">0:literal</span>, console:address/same-as-ingredient:1, screen:address/same-as-ingredient:2 - <span class="Delimiter">}</span> - <span class="Delimiter">{</span> - null?:boolean<span class="Special"> <- </span>equal c:character, <span class="Constant">0:literal/null</span> - <span class="muControl">break-unless</span> null?:boolean - trace <span class="Constant">[app]</span>, <span class="Constant">[slurp-comment: null]</span> - <span class="muControl">reply</span> <span class="Constant">0:literal</span>, console:address/same-as-ingredient:1, screen:address/same-as-ingredient:2 - <span class="Delimiter">}</span> - <span class="Comment"># print</span> - print-character screen:address, c:character, <span class="Constant">4:literal/blue</span> - <span class="Comment"># append</span> - result:address:buffer<span class="Special"> <- </span>buffer-append result:address:buffer, c:character - <span class="Comment"># backspace? decrement</span> - <span class="Delimiter">{</span> - backspace?:boolean<span class="Special"> <- </span>equal c:character, <span class="Constant">8:literal/backspace</span> - <span class="muControl">break-unless</span> backspace?:boolean - characters-slurped:number<span class="Special"> <- </span>subtract characters-slurped:number, <span class="Constant">1:literal</span> - <span class="Delimiter">{</span> - reset-color?:boolean<span class="Special"> <- </span>lesser-or-equal characters-slurped:number, <span class="Constant">0:literal</span> - <span class="muControl">break-unless</span> reset-color?:boolean - trace <span class="Constant">[app]</span>, <span class="Constant">[slurp-comment: too many backspaces; returning]</span> - <span class="muControl">reply</span> result:address:buffer, console:address/same-as-ingredient:1, screen:address/same-as-ingredient:2 - <span class="Delimiter">}</span> - <span class="muControl">loop</span> <span class="Constant">+next-character:label</span> - <span class="Delimiter">}</span> - <span class="Comment"># otherwise increment</span> - characters-slurped:number<span class="Special"> <- </span>add characters-slurped:number, <span class="Constant">1:literal</span> - <span class="Comment"># done with this instruction?</span> - done?:boolean<span class="Special"> <- </span>equal c:character, <span class="Constant">10:literal/newline</span> - <span class="muControl">break-if</span> done?:boolean - <span class="muControl">loop</span> - <span class="Delimiter">}</span> - trace <span class="Constant">[app]</span>, <span class="Constant">[slurp-regular-characters: newline encountered; unwinding stack]</span> - <span class="muControl">continue-from</span> complete:continuation -] - -<span class="Comment"># read characters from console, print them to screen in the string color and</span> -<span class="Comment"># accumulate them into a buffer.</span> -<span class="Comment">#</span> -<span class="Comment"># Version of slurp-regular-characters that:</span> -<span class="Comment"># a) doesn't handle comments</span> -<span class="Comment"># b) handles nested strings using recursive calls to itself. Tracks an extra</span> -<span class="Comment"># count in case we backspace out of it.</span> -<span class="muRecipe">recipe</span> slurp-string [ - <span class="Constant">default-space</span>:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span> - result:address:buffer<span class="Special"> <- </span><span class="Constant">next-ingredient</span> - console:address<span class="Special"> <- </span><span class="Constant">next-ingredient</span> - screen:address<span class="Special"> <- </span><span class="Constant">next-ingredient</span> - complete:continuation<span class="Special"> <- </span><span class="Constant">next-ingredient</span> - nested-string?:boolean<span class="Special"> <- </span><span class="Constant">next-ingredient</span> - trace <span class="Constant">[app]</span>, <span class="Constant">[slurp-string]</span> - <span class="Comment"># use this to track when backspace should reset color</span> - characters-slurped:number<span class="Special"> <- </span>copy <span class="Constant">1:literal</span> <span class="Comment"># for the initial '[' that's already appended to result</span> - <span class="Delimiter">{</span> -<span class="Constant"> +next-character</span> - <span class="Comment"># read character</span> - c:character, console:address, found?:boolean<span class="Special"> <- </span>read-key console:address - <span class="muControl">loop-unless</span> found?:boolean <span class="Constant">+next-character:label</span> - <span class="Comment"># quit?</span> - <span class="Delimiter">{</span> - ctrl-d?:boolean<span class="Special"> <- </span>equal c:character, <span class="Constant">4:literal/ctrl-d/eof</span> - <span class="muControl">break-unless</span> ctrl-d?:boolean - trace <span class="Constant">[app]</span>, <span class="Constant">[slurp-string: ctrl-d]</span> - <span class="muControl">reply</span> <span class="Constant">0:literal</span>, <span class="Constant">0:literal</span>, console:address/same-as-ingredient:1, screen:address/same-as-ingredient:2 - <span class="Delimiter">}</span> - <span class="Delimiter">{</span> - null?:boolean<span class="Special"> <- </span>equal c:character, <span class="Constant">0:literal/null</span> - <span class="muControl">break-unless</span> null?:boolean - trace <span class="Constant">[app]</span>, <span class="Constant">[slurp-string: null]</span> - <span class="muControl">reply</span> <span class="Constant">0:literal</span>, <span class="Constant">0:literal</span>, console:address/same-as-ingredient:1, screen:address/same-as-ingredient:2 - <span class="Delimiter">}</span> - <span class="Comment"># string</span> - <span class="Delimiter">{</span> - string?:boolean<span class="Special"> <- </span>equal c:character, <span class="Constant">91:literal/open-bracket</span> - <span class="muControl">break-unless</span> string?:boolean - trace <span class="Constant">[app]</span>, <span class="Constant">[slurp-string: open-bracket encountered; recursing]</span> - print-character screen:address, c:character, <span class="Constant">6:literal/cyan</span> - result:address:buffer<span class="Special"> <- </span>buffer-append result:address:buffer, c:character - <span class="Comment"># make a recursive call to handle nested strings</span> - result:address:buffer, tmp:number, console:address, screen:address<span class="Special"> <- </span>slurp-string result:address:buffer, console:address, screen:address, complete:continuation, <span class="Constant">1:literal/nested?</span> - <span class="Comment"># but if we backspace over a completed nested string, handle it in the caller</span> - characters-slurped:number<span class="Special"> <- </span>add characters-slurped:number, tmp:number, <span class="Constant">1:literal</span> <span class="Comment"># for the leading '['</span> - <span class="muControl">loop</span> <span class="Constant">+next-character:label</span> - <span class="Delimiter">}</span> - <span class="Comment"># print</span> - print-character screen:address, c:character, <span class="Constant">6:literal/cyan</span> - <span class="Comment"># append</span> - result:address:buffer<span class="Special"> <- </span>buffer-append result:address:buffer, c:character - <span class="Comment"># backspace? decrement</span> - <span class="Delimiter">{</span> - backspace?:boolean<span class="Special"> <- </span>equal c:character, <span class="Constant">8:literal/backspace</span> - <span class="muControl">break-unless</span> backspace?:boolean - characters-slurped:number<span class="Special"> <- </span>subtract characters-slurped:number, <span class="Constant">1:literal</span> - <span class="Delimiter">{</span> - reset-color?:boolean<span class="Special"> <- </span>lesser-or-equal characters-slurped:number, <span class="Constant">0:literal</span> - <span class="muControl">break-unless</span> reset-color?:boolean - trace <span class="Constant">[app]</span>, <span class="Constant">[slurp-string: too many backspaces; returning]</span> - <span class="muControl">reply</span> result:address:buffer/same-as-ingredient:0, <span class="Constant">0:literal</span>, console:address/same-as-ingredient:1, screen:address/same-as-ingredient:2 - <span class="Delimiter">}</span> - <span class="muControl">loop</span> <span class="Constant">+next-character:label</span> - <span class="Delimiter">}</span> - <span class="Comment"># otherwise increment</span> - characters-slurped:number<span class="Special"> <- </span>add characters-slurped:number, <span class="Constant">1:literal</span> - <span class="Comment"># done with this instruction?</span> - done?:boolean<span class="Special"> <- </span>equal c:character, <span class="Constant">93:literal/close-bracket</span> - <span class="muControl">break-if</span> done?:boolean - <span class="muControl">loop</span> - <span class="Delimiter">}</span> - <span class="Delimiter">{</span> - <span class="muControl">break-unless</span> nested-string?:boolean - <span class="Comment"># nested string? return like a normal recipe</span> - <span class="muControl">reply</span> result:address:buffer, characters-slurped:number, console:address, screen:address - <span class="Delimiter">}</span> - <span class="Comment"># top-level string call? recurse</span> - trace <span class="Constant">[app]</span>, <span class="Constant">[slurp-string: close-bracket encountered; recursing to regular characters]</span> - result:address:buffer, console:address, screen:address<span class="Special"> <- </span>slurp-regular-characters result:address:buffer, console:address, screen:address, complete:continuation - <span class="Comment"># backspaced back into this string</span> - trace <span class="Constant">[app]</span>, <span class="Constant">[slurp-string: backspaced back into string; restarting]</span> - <span class="muControl">jump</span> <span class="Constant">+next-character:label</span> -] - -<span class="muRecipe">recipe</span> slurp-assignment [ - <span class="Constant">default-space</span>:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span> - result:address:buffer<span class="Special"> <- </span><span class="Constant">next-ingredient</span> - console:address<span class="Special"> <- </span><span class="Constant">next-ingredient</span> - screen:address<span class="Special"> <- </span><span class="Constant">next-ingredient</span> - complete:continuation<span class="Special"> <- </span><span class="Constant">next-ingredient</span> - <span class="Delimiter">{</span> -<span class="Constant"> +next-character</span> - <span class="Comment"># read character</span> - c:character, console:address, found?:boolean<span class="Special"> <- </span>read-key console:address - <span class="muControl">loop-unless</span> found?:boolean <span class="Constant">+next-character:label</span> - <span class="Comment"># quit?</span> - <span class="Delimiter">{</span> - ctrl-d?:boolean<span class="Special"> <- </span>equal c:character, <span class="Constant">4:literal/ctrl-d/eof</span> - <span class="muControl">break-unless</span> ctrl-d?:boolean - trace <span class="Constant">[app]</span>, <span class="Constant">[slurp-assignment: ctrl-d]</span> - <span class="muControl">reply</span> <span class="Constant">0:literal</span>, console:address/same-as-ingredient:1, screen:address/same-as-ingredient:2 - <span class="Delimiter">}</span> - <span class="Delimiter">{</span> - null?:boolean<span class="Special"> <- </span>equal c:character, <span class="Constant">0:literal/null</span> - <span class="muControl">break-unless</span> null?:boolean - trace <span class="Constant">[app]</span>, <span class="Constant">[slurp-assignment: null]</span> - <span class="muControl">reply</span> <span class="Constant">0:literal</span>, console:address/same-as-ingredient:1, screen:address/same-as-ingredient:2 - <span class="Delimiter">}</span> - <span class="Comment"># print</span> - print-character screen:address, c:character, <span class="Constant">1:literal/red</span> - trace <span class="Constant">[app]</span>, <span class="Constant">[slurp-assignment: saved one character]</span> - <span class="Comment"># append</span> - result:address:buffer<span class="Special"> <- </span>buffer-append result:address:buffer, c:character - <span class="Comment"># backspace? return</span> - <span class="Delimiter">{</span> - backspace?:boolean<span class="Special"> <- </span>equal c:character, <span class="Constant">8:literal/backspace</span> - <span class="muControl">break-unless</span> backspace?:boolean - trace <span class="Constant">[app]</span>, <span class="Constant">[slurp-assignment: backspace; returning]</span> - <span class="muControl">reply</span> result:address:buffer/same-as-ingredient:0, console:address/same-as-ingredient:1, screen:address/same-as-ingredient:2 - <span class="Delimiter">}</span> - <span class="Delimiter">}</span> - trace <span class="Constant">[app]</span>, <span class="Constant">[slurp-assignment: done, recursing to regular characters]</span> - result:address:buffer, console:address, screen:address<span class="Special"> <- </span>slurp-regular-characters result:address:buffer, console:address, screen:address, complete:continuation - <span class="Comment"># backspaced back into this string</span> - trace <span class="Constant">[app]</span>, <span class="Constant">[slurp-assignment: backspaced back into assignment; restarting]</span> - <span class="muControl">jump</span> <span class="Constant">+next-character:label</span> -] - -<span class="muScenario">scenario</span> read-instruction-color-comment [ - assume-screen <span class="Constant">30:literal/width</span>, <span class="Constant">5:literal/height</span> - assume-console [ - type <span class="Constant">[# comment]</span> - ] - run [ - read-instruction console:address, screen:address - ] - screen-should-contain-in-color <span class="Constant">4:literal/blue</span>, [ - <span class="Constant"> .# comment .</span> - <span class="Constant"> . .</span> - ] - screen-should-contain-in-color <span class="Constant">7:literal/white</span>, [ - <span class="Constant"> . .</span> - <span class="Constant"> . .</span> - ] -] - -<span class="muScenario">scenario</span> read-instruction-cancel-comment-on-backspace [ - assume-screen <span class="Constant">30:literal/width</span>, <span class="Constant">5:literal/height</span> - assume-console [ - type <span class="Constant">[#a««z]</span> - ] - backspace:event<span class="Special"> <- </span>merge <span class="Constant">0:literal/text</span>, <span class="Constant">8:literal/backspace</span>, <span class="Constant">0:literal/dummy</span>, <span class="Constant">0:literal/dummy</span> - replace-in-console <span class="Constant">171:literal/«</span>, backspace:event - run [ - read-instruction console:address, screen:address - ] - screen-should-contain-in-color <span class="Constant">4:literal/blue</span>, [ - <span class="Constant"> . .</span> - <span class="Constant"> . .</span> - ] - screen-should-contain-in-color <span class="Constant">7:literal/white</span>, [ - <span class="Constant"> .z .</span> - <span class="Constant"> . .</span> - ] -] - -<span class="muScenario">scenario</span> read-instruction-cancel-comment-on-backspace2 [ - assume-screen <span class="Constant">30:literal/width</span>, <span class="Constant">5:literal/height</span> - assume-console [ - type <span class="Constant">[#ab«««z]</span> - ] - backspace:event<span class="Special"> <- </span>merge <span class="Constant">0:literal/text</span>, <span class="Constant">8:literal/backspace</span>, <span class="Constant">0:literal/dummy</span>, <span class="Constant">0:literal/dummy</span> - replace-in-console <span class="Constant">171:literal/«</span>, backspace:event - run [ - read-instruction console:address, screen:address - ] - screen-should-contain-in-color <span class="Constant">4:literal/blue</span>, [ - <span class="Constant"> . .</span> - <span class="Constant"> . .</span> - ] - screen-should-contain-in-color <span class="Constant">7:literal/white</span>, [ - <span class="Constant"> .z .</span> - <span class="Constant"> . .</span> - ] -] - -<span class="muScenario">scenario</span> read-instruction-cancel-comment-on-backspace3 [ - assume-screen <span class="Constant">30:literal/width</span>, <span class="Constant">5:literal/height</span> - assume-console [ - type <span class="Constant">[#a«z]</span> - ] - backspace:event<span class="Special"> <- </span>merge <span class="Constant">0:literal/text</span>, <span class="Constant">8:literal/backspace</span>, <span class="Constant">0:literal/dummy</span>, <span class="Constant">0:literal/dummy</span> - replace-in-console <span class="Constant">171:literal/«</span>, backspace:event - run [ - read-instruction console:address, screen:address - ] - screen-should-contain-in-color <span class="Constant">4:literal/blue</span>, [ - <span class="Constant"> .#z .</span> - <span class="Constant"> . .</span> - ] - screen-should-contain-in-color <span class="Constant">7:literal/white</span>, [ - <span class="Constant"> . .</span> - <span class="Constant"> . .</span> - ] -] - -<span class="muScenario">scenario</span> read-instruction-stop-after-comment [ - assume-screen <span class="Constant">30:literal/width</span>, <span class="Constant">5:literal/height</span> - <span class="Comment"># console contains comment and then a second line</span> - assume-console [ - type <span class="Constant">[#abc</span> -<span class="Constant">3]</span> - ] - run [ - read-instruction console:address, screen:address - ] - <span class="Comment"># check that read-instruction reads just the comment</span> - screen-should-contain [ - <span class="Constant"> .#abc .</span> - <span class="Constant"> . .</span> - ] -] - -<span class="muScenario">scenario</span> read-instruction-color-string [ -<span class="CommentedCode">#? $start-tracing #? 1</span> - assume-screen <span class="Constant">30:literal/width</span>, <span class="Constant">5:literal/height</span> - assume-console [ - type <span class="Constant">[abc [string]</span>] - ] - run [ - read-instruction console:address, screen:address - ] - screen-should-contain [ - <span class="Constant"> .abc [string] .</span> - <span class="Constant"> . .</span> - ] - screen-should-contain-in-color <span class="Constant">6:literal/cyan</span>, [ - <span class="Constant"> . [string] .</span> - <span class="Constant"> . .</span> - ] - screen-should-contain-in-color <span class="Constant">7:literal/white</span>, [ - <span class="Constant"> .abc .</span> - <span class="Constant"> . .</span> - ] -] - -<span class="muScenario">scenario</span> read-instruction-color-string-multiline [ - assume-screen <span class="Constant">30:literal/width</span>, <span class="Constant">5:literal/height</span> - assume-console [ - type <span class="Constant">[abc [line1</span> -<span class="Constant">line2]</span>] - ] - run [ - read-instruction console:address, screen:address - ] - screen-should-contain [ - <span class="Constant"> .abc [line1 .</span> - <span class="Constant"> .line2] .</span> - <span class="Constant"> . .</span> - ] - screen-should-contain-in-color <span class="Constant">6:literal/cyan</span>, [ - <span class="Constant"> . [line1 .</span> - <span class="Constant"> .line2] .</span> - <span class="Constant"> . .</span> - ] - screen-should-contain-in-color <span class="Constant">7:literal/white</span>, [ - <span class="Constant"> .abc .</span> - <span class="Constant"> . .</span> - <span class="Constant"> . .</span> - ] -] - -<span class="muScenario">scenario</span> read-instruction-color-string-and-comment [ - assume-screen <span class="Constant">30:literal/width</span>, <span class="Constant">5:literal/height</span> - assume-console [ - type <span class="Constant">[abc [string]</span> <span class="Comment"># comment]</span> - ] - run [ - read-instruction console:address, screen:address - ] - screen-should-contain [ - <span class="Constant"> .abc [string] # comment .</span> - <span class="Constant"> . .</span> - ] - screen-should-contain-in-color <span class="Constant">4:literal/blue</span>, [ - <span class="Constant"> . # comment .</span> - <span class="Constant"> . .</span> - ] - screen-should-contain-in-color <span class="Constant">6:literal/cyan</span>, [ - <span class="Constant"> . [string] .</span> - <span class="Constant"> . .</span> - ] - screen-should-contain-in-color <span class="Constant">7:literal/white</span>, [ - <span class="Constant"> .abc .</span> - <span class="Constant"> . .</span> - ] -] - -<span class="muScenario">scenario</span> read-instruction-ignore-comment-inside-string [ - assume-screen <span class="Constant">30:literal/width</span>, <span class="Constant">5:literal/height</span> - assume-console [ - type <span class="Constant">[abc [string # not a comment]</span>] - ] - run [ - read-instruction console:address, screen:address - ] - screen-should-contain [ - <span class="Constant"> .abc [string # not a comment] .</span> - <span class="Constant"> . .</span> - ] - screen-should-contain-in-color <span class="Constant">6:literal/cyan</span>, [ - <span class="Constant"> . [string # not a comment] .</span> - <span class="Constant"> . .</span> - ] - screen-should-contain-in-color <span class="Constant">7:literal/white</span>, [ - <span class="Constant"> .abc .</span> - <span class="Constant"> . .</span> - ] - screen-should-contain-in-color <span class="Constant">4:literal/blue</span>, [ - <span class="Constant"> . .</span> - <span class="Constant"> . .</span> - ] -] - -<span class="muScenario">scenario</span> read-instruction-ignore-string-inside-comment [ - assume-screen <span class="Constant">30:literal/width</span>, <span class="Constant">5:literal/height</span> - assume-console [ - type <span class="Constant">[abc # comment [not a string]</span>] - ] - run [ - read-instruction console:address, screen:address - ] - screen-should-contain [ - <span class="Constant"> .abc # comment [not a string] .</span> - <span class="Constant"> . .</span> - ] - screen-should-contain-in-color <span class="Constant">6:literal/cyan</span>, [ - <span class="Constant"> . .</span> - <span class="Constant"> . .</span> - ] - screen-should-contain-in-color <span class="Constant">7:literal/white</span>, [ - <span class="Constant"> .abc .</span> - <span class="Constant"> . .</span> - ] - screen-should-contain-in-color <span class="Constant">4:literal/blue</span>, [ - <span class="Constant"> . # comment [not a string] .</span> - <span class="Constant"> . .</span> - ] -] - -<span class="muScenario">scenario</span> read-instruction-color-string-inside-string [ - assume-screen <span class="Constant">30:literal/width</span>, <span class="Constant">5:literal/height</span> - assume-console [ - type <span class="Constant">[abc [string [inner string]</span>]] - ] - run [ -<span class="CommentedCode">#? $start-tracing #? 1</span> - read-instruction console:address, screen:address -<span class="CommentedCode">#? $stop-tracing #? 1</span> -<span class="CommentedCode">#? $browse-trace #? 1</span> - ] - screen-should-contain [ - <span class="Constant"> .abc [string [inner string]] .</span> - <span class="Constant"> . .</span> - ] - screen-should-contain-in-color <span class="Constant">6:literal/cyan</span>, [ - <span class="Constant"> . [string [inner string]] .</span> - <span class="Constant"> . .</span> - ] - screen-should-contain-in-color <span class="Constant">7:literal/white</span>, [ - <span class="Constant"> .abc .</span> - <span class="Constant"> . .</span> - ] -] - -<span class="muScenario">scenario</span> read-instruction-cancel-string-on-backspace [ - assume-screen <span class="Constant">30:literal/width</span>, <span class="Constant">5:literal/height</span> - assume-console [ - type <span class="Constant">[(a««z]</span> <span class="Comment"># '(' is '[' and '«' is backspace</span> - ] - open-bracket:event<span class="Special"> <- </span>merge <span class="Constant">0:literal/text</span>, <span class="Constant">91:literal/open-bracket</span>, <span class="Constant">0:literal/dummy</span>, <span class="Constant">0:literal/dummy</span> - replace-in-console <span class="Constant">40:literal/open-paren</span>, open-bracket:event - backspace:event<span class="Special"> <- </span>merge <span class="Constant">0:literal/text</span>, <span class="Constant">8:literal/backspace</span>, <span class="Constant">0:literal/dummy</span>, <span class="Constant">0:literal/dummy</span> - replace-in-console <span class="Constant">171:literal/«</span>, backspace:event - run [ -<span class="CommentedCode">#? d:address:array:event <- get console:address/deref, data:offset #? 1</span> -<span class="CommentedCode">#? $print [a: ], d:address:array:event #? 1</span> -<span class="CommentedCode">#? x:number <- length d:address:array:event/deref #? 1</span> -<span class="CommentedCode">#? $print [b: ], x:number #? 1</span> - read-instruction console:address, screen:address - ] - screen-should-contain-in-color <span class="Constant">6:literal/cyan</span>, [ - <span class="Constant"> . .</span> - <span class="Constant"> . .</span> - ] - screen-should-contain-in-color <span class="Constant">7:literal/white</span>, [ - <span class="Constant"> .z .</span> - <span class="Constant"> . .</span> - ] -] - -<span class="muScenario">scenario</span> read-instruction-cancel-string-inside-string-on-backspace [ - assume-screen <span class="Constant">30:literal/width</span>, <span class="Constant">5:literal/height</span> - assume-console [ - type <span class="Constant">[(a[b]</span>«««b)] <span class="Comment"># '(' is '[' and '«' is backspace</span> - ] - open-bracket:event<span class="Special"> <- </span>merge <span class="Constant">0:literal/text</span>, <span class="Constant">91:literal/open-bracket</span>, <span class="Constant">0:literal/dummy</span>, <span class="Constant">0:literal/dummy</span> - replace-in-console <span class="Constant">40:literal/open-paren</span>, open-bracket:event - close-bracket:event<span class="Special"> <- </span>merge <span class="Constant">0:literal/text</span>, <span class="Constant">93:literal/close-bracket</span>, <span class="Constant">0:literal/dummy</span>, <span class="Constant">0:literal/dummy</span> - replace-in-console <span class="Constant">41:literal/close-paren</span>, close-bracket:event - backspace:event<span class="Special"> <- </span>merge <span class="Constant">0:literal/text</span>, <span class="Constant">8:literal/backspace</span>, <span class="Constant">0:literal/dummy</span>, <span class="Constant">0:literal/dummy</span> - replace-in-console <span class="Constant">171:literal/«</span>, backspace:event - run [ - read-instruction console:address, screen:address - ] - screen-should-contain-in-color <span class="Constant">6:literal/cyan</span>, [ - <span class="Constant"> .[ab] .</span> - <span class="Constant"> . .</span> - ] - screen-should-contain-in-color <span class="Constant">7:literal/white</span>, [ - <span class="Constant"> . .</span> - <span class="Constant"> . .</span> - ] -] - -<span class="muScenario">scenario</span> read-instruction-backspace-back-into-string [ - assume-screen <span class="Constant">30:literal/width</span>, <span class="Constant">5:literal/height</span> - assume-console [ - type <span class="Constant">[[a]</span>«b] <span class="Comment"># '«' is backspace</span> - ] - backspace:event<span class="Special"> <- </span>merge <span class="Constant">0:literal/text</span>, <span class="Constant">8:literal/backspace</span>, <span class="Constant">0:literal/dummy</span>, <span class="Constant">0:literal/dummy</span> - replace-in-console <span class="Constant">171:literal/«</span>, backspace:event - run [ - read-instruction console:address, screen:address - ] - screen-should-contain [ - <span class="Constant"> .\\\[ab .</span> - <span class="Constant"> . .</span> - ] -<span class="CommentedCode">#? $print [aaa] #? 1</span> - screen-should-contain-in-color <span class="Constant">6:literal/cyan</span>, [ - <span class="Constant"> .\\\[ab .</span> - <span class="Constant"> . .</span> - ] - screen-should-contain-in-color <span class="Constant">7:literal/white</span>, [ - <span class="Constant"> . .</span> - <span class="Constant"> . .</span> - ] - <span class="Comment"># todo: trace sequence of events</span> - <span class="Comment"># slurp-regular-characters: [</span> - <span class="Comment"># slurp-regular-characters/slurp-string: a</span> - <span class="Comment"># slurp-regular-characters/slurp-string: ]</span> - <span class="Comment"># slurp-regular-characters/slurp-string/slurp-regular-characters: backspace</span> - <span class="Comment"># slurp-regular-characters/slurp-string: b</span> -] - -<span class="muScenario">scenario</span> read-instruction-highlight-start-of-assignment [ - assume-screen <span class="Constant">30:literal/width</span>, <span class="Constant">5:literal/height</span> - assume-console [ - type <span class="Constant">[a <]</span> - ] - run [ - read-instruction console:address, screen:address - ] - screen-should-contain [ - <span class="Constant"> .a < .</span> - <span class="Constant"> . .</span> - ] - screen-should-contain-in-color <span class="Constant">1:literal/red</span>, [ - <span class="Constant"> . < .</span> - <span class="Constant"> . .</span> - ] - screen-should-contain-in-color <span class="Constant">7:literal/white</span>, [ - <span class="Constant"> .a .</span> - <span class="Constant"> . .</span> - ] -] - -<span class="muScenario">scenario</span> read-instruction-highlight-assignment [ - assume-screen <span class="Constant">30:literal/width</span>, <span class="Constant">5:literal/height</span> - assume-console [ - type <span class="Constant">[a <- b]</span> - ] - run [ - read-instruction console:address, screen:address - ] - screen-should-contain [ - <span class="Constant"> .a <- b .</span> - <span class="Constant"> . .</span> - ] - screen-should-contain-in-color <span class="Constant">1:literal/red</span>, [ - <span class="Constant"> . <- .</span> - <span class="Constant"> . .</span> - ] - screen-should-contain-in-color <span class="Constant">7:literal/white</span>, [ - <span class="Constant"> .a b .</span> - <span class="Constant"> . .</span> - ] -] - -<span class="muScenario">scenario</span> read-instruction-backspace-over-assignment [ - assume-screen <span class="Constant">30:literal/width</span>, <span class="Constant">5:literal/height</span> - assume-console [ - type <span class="Constant">[a <-«]</span> <span class="Comment"># '«' is backspace</span> - ] - backspace:event<span class="Special"> <- </span>merge <span class="Constant">0:literal/text</span>, <span class="Constant">8:literal/backspace</span>, <span class="Constant">0:literal/dummy</span>, <span class="Constant">0:literal/dummy</span> - replace-in-console <span class="Constant">171:literal/«</span>, backspace:event - run [ - read-instruction console:address, screen:address - ] - screen-should-contain [ - <span class="Constant"> .a < .</span> - <span class="Constant"> . .</span> - ] - screen-should-contain-in-color <span class="Constant">1:literal/red</span>, [ - <span class="Constant"> . < .</span> - <span class="Constant"> . .</span> - ] - screen-should-contain-in-color <span class="Constant">7:literal/white</span>, [ - <span class="Constant"> .a .</span> - <span class="Constant"> . .</span> - ] -] - -<span class="muScenario">scenario</span> read-instruction-assignment-continues-after-backspace [ - assume-screen <span class="Constant">30:literal/width</span>, <span class="Constant">5:literal/height</span> - assume-console [ - type <span class="Constant">[a <-«-]</span> <span class="Comment"># '«' is backspace</span> - ] - backspace:event<span class="Special"> <- </span>merge <span class="Constant">0:literal/text</span>, <span class="Constant">8:literal/backspace</span>, <span class="Constant">0:literal/dummy</span>, <span class="Constant">0:literal/dummy</span> - replace-in-console <span class="Constant">171:literal/«</span>, backspace:event -<span class="CommentedCode">#? $print [aaa] #? 1</span> - run [ - read-instruction console:address, screen:address - ] - screen-should-contain [ - <span class="Constant"> .a <- .</span> - <span class="Constant"> . .</span> - ] - screen-should-contain-in-color <span class="Constant">1:literal/red</span>, [ - <span class="Constant"> . <- .</span> - <span class="Constant"> . .</span> - ] - screen-should-contain-in-color <span class="Constant">7:literal/white</span>, [ - <span class="Constant"> .a .</span> - <span class="Constant"> . .</span> - ] -] - -<span class="muScenario">scenario</span> read-instruction-assignment-continues-after-backspace2 [ - assume-screen <span class="Constant">30:literal/width</span>, <span class="Constant">5:literal/height</span> - assume-console [ - type <span class="Constant">[a <- ««-]</span> <span class="Comment"># '«' is backspace</span> - ] - backspace:event<span class="Special"> <- </span>merge <span class="Constant">0:literal/text</span>, <span class="Constant">8:literal/backspace</span>, <span class="Constant">0:literal/dummy</span>, <span class="Constant">0:literal/dummy</span> - replace-in-console <span class="Constant">171:literal/«</span>, backspace:event - run [ - read-instruction console:address, screen:address -<span class="CommentedCode">#? $browse-trace #? 1</span> - ] - screen-should-contain [ - <span class="Constant"> .a <- .</span> - <span class="Constant"> . .</span> - ] - screen-should-contain-in-color <span class="Constant">1:literal/red</span>, [ - <span class="Constant"> . <- .</span> - <span class="Constant"> . .</span> - ] - screen-should-contain-in-color <span class="Constant">7:literal/white</span>, [ - <span class="Constant"> .a .</span> - <span class="Constant"> . .</span> - ] -] -</pre> -</body> -</html> -<!-- vim: set foldmethod=manual : --> |