diff options
author | Kartik K. Agaram <vc@akkartik.com> | 2015-06-12 22:34:45 -0700 |
---|---|---|
committer | Kartik K. Agaram <vc@akkartik.com> | 2015-06-12 22:34:45 -0700 |
commit | d44123cabaa730c778a0e2644c75dbfba6a7ab30 (patch) | |
tree | a24e90f9fc864ea5b1c5e1f13433f55ad7acd30b /html/060string.mu.html | |
parent | 1ae4e0d95f7e37dc7d0b146542fc39b4aed491de (diff) | |
download | mu-d44123cabaa730c778a0e2644c75dbfba6a7ab30.tar.gz |
1556
Diffstat (limited to 'html/060string.mu.html')
-rw-r--r-- | html/060string.mu.html | 258 |
1 files changed, 129 insertions, 129 deletions
diff --git a/html/060string.mu.html b/html/060string.mu.html index 18869d3c..43ecdd77 100644 --- a/html/060string.mu.html +++ b/html/060string.mu.html @@ -13,14 +13,14 @@ pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-color: #080808; } body { font-family: monospace; color: #eeeeee; background-color: #080808; } * { font-size: 1em; } -.CommentedCode { color: #6c6c6c; } +.muScenario { color: #00af00; } .Delimiter { color: #c000c0; } .Comment { color: #8080ff; } .Constant { color: #008080; } .Special { color: #ff6060; } -.Identifier { color: #008080; } +.CommentedCode { color: #6c6c6c; } +.muControl { color: #804000; } .muRecipe { color: #ff8700; } -.muScenario { color: #00af00; } --> </style> @@ -35,40 +35,40 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } <span class="Comment"># Some useful helpers for dealing with strings.</span> <span class="muRecipe">recipe</span> string-equal [ - <span class="Identifier">default-space</span>:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span> - a:address:array:character<span class="Special"> <- </span><span class="Identifier">next-ingredient</span> + <span class="Constant">default-space</span>:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span> + a:address:array:character<span class="Special"> <- </span><span class="Constant">next-ingredient</span> a-len:number<span class="Special"> <- </span>length a:address:array:character/deref - b:address:array:character<span class="Special"> <- </span><span class="Identifier">next-ingredient</span> + b:address:array:character<span class="Special"> <- </span><span class="Constant">next-ingredient</span> b-len:number<span class="Special"> <- </span>length b:address:array:character/deref <span class="Comment"># compare lengths</span> <span class="Delimiter">{</span> trace <span class="Constant">[string-equal]</span>, <span class="Constant">[comparing lengths]</span> length-equal?:boolean<span class="Special"> <- </span>equal a-len:number, b-len:number - <span class="Identifier">break-if</span> length-equal?:boolean - <span class="Identifier">reply</span> <span class="Constant">0:literal</span> + <span class="muControl">break-if</span> length-equal?:boolean + <span class="muControl">reply</span> <span class="Constant">0:literal</span> <span class="Delimiter">}</span> <span class="Comment"># compare each corresponding character</span> trace <span class="Constant">[string-equal]</span>, <span class="Constant">[comparing characters]</span> i:number<span class="Special"> <- </span>copy <span class="Constant">0:literal</span> <span class="Delimiter">{</span> done?:boolean<span class="Special"> <- </span>greater-or-equal i:number, a-len:number - <span class="Identifier">break-if</span> done?:boolean + <span class="muControl">break-if</span> done?:boolean a2:character<span class="Special"> <- </span>index a:address:array:character/deref, i:number b2:character<span class="Special"> <- </span>index b:address:array:character/deref, i:number <span class="Delimiter">{</span> chars-match?:boolean<span class="Special"> <- </span>equal a2:character, b2:character - <span class="Identifier">break-if</span> chars-match?:boolean - <span class="Identifier">reply</span> <span class="Constant">0:literal</span> + <span class="muControl">break-if</span> chars-match?:boolean + <span class="muControl">reply</span> <span class="Constant">0:literal</span> <span class="Delimiter">}</span> i:number<span class="Special"> <- </span>add i:number, <span class="Constant">1:literal</span> - <span class="Identifier">loop</span> + <span class="muControl">loop</span> <span class="Delimiter">}</span> - <span class="Identifier">reply</span> <span class="Constant">1:literal</span> + <span class="muControl">reply</span> <span class="Constant">1:literal</span> ] <span class="muScenario">scenario</span> string-equal-reflexive [ run [ - <span class="Identifier">default-space</span>:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span> + <span class="Constant">default-space</span>:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span> x:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abc]</span> 3:boolean/<span class="Special">raw <- </span>string-equal x:address:array:character, x:address:array:character ] @@ -79,7 +79,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } <span class="muScenario">scenario</span> string-equal-identical [ run [ - <span class="Identifier">default-space</span>:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span> + <span class="Constant">default-space</span>:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span> x:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abc]</span> y:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abc]</span> 3:boolean/<span class="Special">raw <- </span>string-equal x:address:array:character, y:address:array:character @@ -91,7 +91,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } <span class="muScenario">scenario</span> string-equal-distinct-lengths [ run [ - <span class="Identifier">default-space</span>:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span> + <span class="Constant">default-space</span>:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span> x:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abc]</span> y:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abcd]</span> 3:boolean/<span class="Special">raw <- </span>string-equal x:address:array:character, y:address:array:character @@ -109,7 +109,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } <span class="muScenario">scenario</span> string-equal-with-empty [ run [ - <span class="Identifier">default-space</span>:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span> + <span class="Constant">default-space</span>:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span> x:address:array:character<span class="Special"> <- </span>new <span class="Constant">[]</span> y:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abcd]</span> 3:boolean/<span class="Special">raw <- </span>string-equal x:address:array:character, y:address:array:character @@ -121,7 +121,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } <span class="muScenario">scenario</span> string-equal-common-lengths-but-distinct [ run [ - <span class="Identifier">default-space</span>:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span> + <span class="Constant">default-space</span>:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span> x:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abc]</span> y:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abd]</span> 3:boolean/<span class="Special">raw <- </span>string-equal x:address:array:character, y:address:array:character @@ -138,23 +138,23 @@ container buffer [ ] <span class="muRecipe">recipe</span> init-buffer [ - <span class="Identifier">default-space</span>:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span> + <span class="Constant">default-space</span>:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span> <span class="CommentedCode">#? $print default-space:address:array:location, [</span> <span class="CommentedCode">#? ]</span> result:address:buffer<span class="Special"> <- </span>new buffer:type len:address:number<span class="Special"> <- </span>get-address result:address:buffer/deref, length:offset len:address:number/deref<span class="Special"> <- </span>copy <span class="Constant">0:literal</span> s:address:address:array:character<span class="Special"> <- </span>get-address result:address:buffer/deref, data:offset - capacity:number<span class="Special"> <- </span><span class="Identifier">next-ingredient</span> + capacity:number<span class="Special"> <- </span><span class="Constant">next-ingredient</span> s:address:address:array:character/deref<span class="Special"> <- </span>new character:type, capacity:number <span class="CommentedCode">#? $print s:address:address:array:character/deref, [</span> <span class="CommentedCode">#? ]</span> - <span class="Identifier">reply</span> result:address:buffer + <span class="muControl">reply</span> result:address:buffer ] <span class="muRecipe">recipe</span> grow-buffer [ - <span class="Identifier">default-space</span>:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span> - in:address:buffer<span class="Special"> <- </span><span class="Identifier">next-ingredient</span> + <span class="Constant">default-space</span>:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span> + in:address:buffer<span class="Special"> <- </span><span class="Constant">next-ingredient</span> <span class="Comment"># double buffer size</span> x:address:address:array:character<span class="Special"> <- </span>get-address in:address:buffer/deref, data:offset oldlen:number<span class="Special"> <- </span>length x:address:address:array:character/deref/deref @@ -165,57 +165,57 @@ container buffer [ i:number<span class="Special"> <- </span>copy <span class="Constant">0:literal</span> <span class="Delimiter">{</span> done?:boolean<span class="Special"> <- </span>greater-or-equal i:number, oldlen:number - <span class="Identifier">break-if</span> done?:boolean + <span class="muControl">break-if</span> done?:boolean src:character<span class="Special"> <- </span>index olddata:address:array:character/deref, i:number dest:address:character<span class="Special"> <- </span>index-address x:address:address:array:character/deref/deref, i:number dest:address:character/deref<span class="Special"> <- </span>copy src:character i:number<span class="Special"> <- </span>add i:number, <span class="Constant">1:literal</span> - <span class="Identifier">loop</span> + <span class="muControl">loop</span> <span class="Delimiter">}</span> - <span class="Identifier">reply</span> in:address:buffer + <span class="muControl">reply</span> in:address:buffer ] <span class="muRecipe">recipe</span> buffer-full? [ - <span class="Identifier">default-space</span>:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span> - in:address:buffer<span class="Special"> <- </span><span class="Identifier">next-ingredient</span> + <span class="Constant">default-space</span>:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span> + in:address:buffer<span class="Special"> <- </span><span class="Constant">next-ingredient</span> len:number<span class="Special"> <- </span>get in:address:buffer/deref, length:offset s:address:array:character<span class="Special"> <- </span>get in:address:buffer/deref, data:offset capacity:number<span class="Special"> <- </span>length s:address:array:character/deref result:boolean<span class="Special"> <- </span>greater-or-equal len:number, capacity:number - <span class="Identifier">reply</span> result:boolean + <span class="muControl">reply</span> result:boolean ] <span class="Comment"># in:address:buffer <- buffer-append in:address:buffer, c:character</span> <span class="muRecipe">recipe</span> buffer-append [ - <span class="Identifier">default-space</span>:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span> - in:address:buffer<span class="Special"> <- </span><span class="Identifier">next-ingredient</span> - c:character<span class="Special"> <- </span><span class="Identifier">next-ingredient</span> + <span class="Constant">default-space</span>:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span> + in:address:buffer<span class="Special"> <- </span><span class="Constant">next-ingredient</span> + c:character<span class="Special"> <- </span><span class="Constant">next-ingredient</span> len:address:number<span class="Special"> <- </span>get-address in:address:buffer/deref, length:offset <span class="Delimiter">{</span> <span class="Comment"># backspace? just drop last character if it exists and return</span> backspace?:boolean<span class="Special"> <- </span>equal c:character, <span class="Constant">8:literal/backspace</span> - <span class="Identifier">break-unless</span> backspace?:boolean + <span class="muControl">break-unless</span> backspace?:boolean empty?:boolean<span class="Special"> <- </span>lesser-or-equal len:address:number/deref, <span class="Constant">0:literal</span> - <span class="Identifier">reply-if</span> empty?:boolean, in:address:buffer/same-as-ingredient:0 + <span class="muControl">reply-if</span> empty?:boolean, in:address:buffer/same-as-ingredient:0 len:address:number/deref<span class="Special"> <- </span>subtract len:address:number/deref, <span class="Constant">1:literal</span> - <span class="Identifier">reply</span> in:address:buffer/same-as-ingredient:0 + <span class="muControl">reply</span> in:address:buffer/same-as-ingredient:0 <span class="Delimiter">}</span> <span class="Delimiter">{</span> <span class="Comment"># grow buffer if necessary</span> full?:boolean<span class="Special"> <- </span>buffer-full? in:address:buffer - <span class="Identifier">break-unless</span> full?:boolean + <span class="muControl">break-unless</span> full?:boolean in:address:buffer<span class="Special"> <- </span>grow-buffer in:address:buffer <span class="Delimiter">}</span> s:address:array:character<span class="Special"> <- </span>get in:address:buffer/deref, data:offset dest:address:character<span class="Special"> <- </span>index-address s:address:array:character/deref, len:address:number/deref dest:address:character/deref<span class="Special"> <- </span>copy c:character len:address:number/deref<span class="Special"> <- </span>add len:address:number/deref, <span class="Constant">1:literal</span> - <span class="Identifier">reply</span> in:address:buffer/same-as-ingredient:0 + <span class="muControl">reply</span> in:address:buffer/same-as-ingredient:0 ] <span class="muScenario">scenario</span> buffer-append-works [ run [ - <span class="Identifier">default-space</span>:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span> + <span class="Constant">default-space</span>:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span> x:address:buffer<span class="Special"> <- </span>init-buffer <span class="Constant">3:literal</span> s1:address:array:character<span class="Special"> <- </span>get x:address:buffer/deref, data:offset x:address:buffer<span class="Special"> <- </span>buffer-append x:address:buffer, <span class="Constant">97:literal</span> <span class="Comment"># 'a'</span> @@ -238,7 +238,7 @@ container buffer [ <span class="CommentedCode">#? $print 1065:number/raw, [</span> <span class="CommentedCode">#? ]</span> 2:array:character/<span class="Special">raw <- </span>copy s2:address:array:character/deref - <span class="Identifier"> +buffer-filled</span> +<span class="Constant"> +buffer-filled</span> x:address:buffer<span class="Special"> <- </span>buffer-append x:address:buffer, <span class="Constant">100:literal</span> <span class="Comment"># 'd'</span> s3:address:array:character<span class="Special"> <- </span>get x:address:buffer/deref, data:offset 10:boolean/<span class="Special">raw <- </span>equal s1:address:array:character, s3:address:array:character @@ -267,7 +267,7 @@ container buffer [ <span class="muScenario">scenario</span> buffer-append-handles-backspace [ run [ - <span class="Identifier">default-space</span>:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span> + <span class="Constant">default-space</span>:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span> x:address:buffer<span class="Special"> <- </span>init-buffer <span class="Constant">3:literal</span> x:address:buffer<span class="Special"> <- </span>buffer-append x:address:buffer, <span class="Constant">97:literal</span> <span class="Comment"># 'a'</span> x:address:buffer<span class="Special"> <- </span>buffer-append x:address:buffer, <span class="Constant">98:literal</span> <span class="Comment"># 'b'</span> @@ -284,36 +284,36 @@ container buffer [ <span class="Comment"># result:address:array:character <- integer-to-decimal-string n:number</span> <span class="muRecipe">recipe</span> integer-to-decimal-string [ - <span class="Identifier">default-space</span>:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span> - n:number<span class="Special"> <- </span><span class="Identifier">next-ingredient</span> + <span class="Constant">default-space</span>:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span> + n:number<span class="Special"> <- </span><span class="Constant">next-ingredient</span> <span class="Comment"># is it zero?</span> <span class="Delimiter">{</span> - <span class="Identifier">break-if</span> n:number + <span class="muControl">break-if</span> n:number result:address:array:character<span class="Special"> <- </span>new <span class="Constant">[0]</span> - <span class="Identifier">reply</span> result:address:array:character + <span class="muControl">reply</span> result:address:array:character <span class="Delimiter">}</span> <span class="Comment"># save sign</span> negate-result:boolean<span class="Special"> <- </span>copy <span class="Constant">0:literal</span> <span class="Delimiter">{</span> negative?:boolean<span class="Special"> <- </span>lesser-than n:number, <span class="Constant">0:literal</span> - <span class="Identifier">break-unless</span> negative?:boolean + <span class="muControl">break-unless</span> negative?:boolean negate-result:boolean<span class="Special"> <- </span>copy <span class="Constant">1:literal</span> - n:number<span class="Special"> <- </span>multiply n:number,<span class="Identifier"> -1</span>:literal + n:number<span class="Special"> <- </span>multiply n:number, <span class="Constant">-1:literal</span> <span class="Delimiter">}</span> <span class="Comment"># add digits from right to left into intermediate buffer</span> tmp:address:buffer<span class="Special"> <- </span>init-buffer <span class="Constant">30:literal</span> digit-base:number<span class="Special"> <- </span>copy <span class="Constant">48:literal</span> <span class="Comment"># '0'</span> <span class="Delimiter">{</span> done?:boolean<span class="Special"> <- </span>equal n:number, <span class="Constant">0:literal</span> - <span class="Identifier">break-if</span> done?:boolean + <span class="muControl">break-if</span> done?:boolean n:number, digit:number<span class="Special"> <- </span>divide-with-remainder n:number, <span class="Constant">10:literal</span> c:character<span class="Special"> <- </span>add digit-base:number, digit:number tmp:address:buffer<span class="Special"> <- </span>buffer-append tmp:address:buffer, c:character - <span class="Identifier">loop</span> + <span class="muControl">loop</span> <span class="Delimiter">}</span> <span class="Comment"># add sign</span> <span class="Delimiter">{</span> - <span class="Identifier">break-unless</span> negate-result:boolean + <span class="muControl">break-unless</span> negate-result:boolean tmp:address:buffer<span class="Special"> <- </span>buffer-append tmp:address:buffer, <span class="Constant">45:literal</span> <span class="Comment"># '-'</span> <span class="Delimiter">}</span> <span class="Comment"># reverse buffer into string result</span> @@ -325,7 +325,7 @@ container buffer [ <span class="Delimiter">{</span> <span class="Comment"># while i >= 0</span> done?:boolean<span class="Special"> <- </span>lesser-than i:number, <span class="Constant">0:literal</span> - <span class="Identifier">break-if</span> done?:boolean + <span class="muControl">break-if</span> done?:boolean <span class="Comment"># result[j] = tmp[i]</span> src:character<span class="Special"> <- </span>index buf:address:array:character/deref, i:number dest:address:character<span class="Special"> <- </span>index-address result:address:array:character/deref, j:number @@ -334,18 +334,18 @@ container buffer [ i:number<span class="Special"> <- </span>subtract i:number, <span class="Constant">1:literal</span> <span class="Comment"># --j</span> j:number<span class="Special"> <- </span>add j:number, <span class="Constant">1:literal</span> - <span class="Identifier">loop</span> + <span class="muControl">loop</span> <span class="Delimiter">}</span> - <span class="Identifier">reply</span> result:address:array:character + <span class="muControl">reply</span> result:address:array:character ] <span class="muRecipe">recipe</span> buffer-to-array [ - <span class="Identifier">default-space</span>:address:array:character<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span> - in:address:buffer<span class="Special"> <- </span><span class="Identifier">next-ingredient</span> + <span class="Constant">default-space</span>:address:array:character<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span> + in:address:buffer<span class="Special"> <- </span><span class="Constant">next-ingredient</span> <span class="Delimiter">{</span> <span class="Comment"># propagate null buffer</span> - <span class="Identifier">break-if</span> in:address:buffer - <span class="Identifier">reply</span> <span class="Constant">0:literal</span> + <span class="muControl">break-if</span> in:address:buffer + <span class="muControl">reply</span> <span class="Constant">0:literal</span> <span class="Delimiter">}</span> len:number<span class="Special"> <- </span>get in:address:buffer/deref, length:offset <span class="CommentedCode">#? $print [size ], len:number, [ </span> @@ -357,14 +357,14 @@ container buffer [ <span class="Delimiter">{</span> <span class="CommentedCode">#? $print i:number #? 1</span> done?:boolean<span class="Special"> <- </span>greater-or-equal i:number, len:number - <span class="Identifier">break-if</span> done?:boolean + <span class="muControl">break-if</span> done?:boolean src:character<span class="Special"> <- </span>index s:address:array:character/deref, i:number dest:address:character<span class="Special"> <- </span>index-address result:address:array:character/deref, i:number dest:address:character/deref<span class="Special"> <- </span>copy src:character i:number<span class="Special"> <- </span>add i:number, <span class="Constant">1:literal</span> - <span class="Identifier">loop</span> + <span class="muControl">loop</span> <span class="Delimiter">}</span> - <span class="Identifier">reply</span> result:address:array:character + <span class="muControl">reply</span> result:address:array:character ] <span class="muScenario">scenario</span> integer-to-decimal-digit-zero [ @@ -389,7 +389,7 @@ container buffer [ <span class="muScenario">scenario</span> integer-to-decimal-digit-negative [ run [ - 1:address:array:character/<span class="Special">raw <- </span>integer-to-decimal-string<span class="Identifier"> -1</span>:literal + 1:address:array:character/<span class="Special">raw <- </span>integer-to-decimal-string <span class="Constant">-1:literal</span> 2:array:character/<span class="Special">raw <- </span>copy 1:address:array:character/deref/<span class="Special">raw</span> ] memory-should-contain [ @@ -401,11 +401,11 @@ container buffer [ <span class="Comment"># result:address:array:character <- string-append a:address:array:character, b:address:array:character</span> <span class="muRecipe">recipe</span> string-append [ - <span class="Identifier">default-space</span>:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span> + <span class="Constant">default-space</span>:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span> <span class="Comment"># result = new character[a.length + b.length]</span> - a:address:array:character<span class="Special"> <- </span><span class="Identifier">next-ingredient</span> + a:address:array:character<span class="Special"> <- </span><span class="Constant">next-ingredient</span> a-len:number<span class="Special"> <- </span>length a:address:array:character/deref - b:address:array:character<span class="Special"> <- </span><span class="Identifier">next-ingredient</span> + b:address:array:character<span class="Special"> <- </span><span class="Constant">next-ingredient</span> b-len:number<span class="Special"> <- </span>length b:address:array:character/deref result-len:number<span class="Special"> <- </span>add a-len:number, b-len:number result:address:array:character<span class="Special"> <- </span>new character:type, result-len:number @@ -415,7 +415,7 @@ container buffer [ <span class="Delimiter">{</span> <span class="Comment"># while i < a.length</span> a-done?:boolean<span class="Special"> <- </span>greater-or-equal i:number, a-len:number - <span class="Identifier">break-if</span> a-done?:boolean + <span class="muControl">break-if</span> a-done?:boolean <span class="Comment"># result[result-idx] = a[i]</span> out:address:character<span class="Special"> <- </span>index-address result:address:array:character/deref, result-idx:number in:character<span class="Special"> <- </span>index a:address:array:character/deref, i:number @@ -424,14 +424,14 @@ container buffer [ i:number<span class="Special"> <- </span>add i:number, <span class="Constant">1:literal</span> <span class="Comment"># ++result-idx</span> result-idx:number<span class="Special"> <- </span>add result-idx:number, <span class="Constant">1:literal</span> - <span class="Identifier">loop</span> + <span class="muControl">loop</span> <span class="Delimiter">}</span> <span class="Comment"># copy b into result</span> i:number<span class="Special"> <- </span>copy <span class="Constant">0:literal</span> <span class="Delimiter">{</span> <span class="Comment"># while i < b.length</span> b-done?:boolean<span class="Special"> <- </span>greater-or-equal i:number, b-len:number - <span class="Identifier">break-if</span> b-done?:boolean + <span class="muControl">break-if</span> b-done?:boolean <span class="Comment"># result[result-idx] = a[i]</span> out:address:character<span class="Special"> <- </span>index-address result:address:array:character/deref, result-idx:number in:character<span class="Special"> <- </span>index b:address:array:character/deref, i:number @@ -440,9 +440,9 @@ container buffer [ i:number<span class="Special"> <- </span>add i:number, <span class="Constant">1:literal</span> <span class="Comment"># ++result-idx</span> result-idx:number<span class="Special"> <- </span>add result-idx:number, <span class="Constant">1:literal</span> - <span class="Identifier">loop</span> + <span class="muControl">loop</span> <span class="Delimiter">}</span> - <span class="Identifier">reply</span> result:address:array:character + <span class="muControl">reply</span> result:address:array:character ] <span class="muScenario">scenario</span> string-append-1 [ @@ -460,25 +460,25 @@ container buffer [ <span class="Comment"># replace underscores in first with remaining args</span> <span class="Comment"># result:address:array:character <- interpolate template:address:array:character, ...</span> <span class="muRecipe">recipe</span> interpolate [ - <span class="Identifier">default-space</span>:array:address:location<span class="Special"> <- </span>new location:type, <span class="Constant">60:literal</span> - template:address:array:character<span class="Special"> <- </span><span class="Identifier">next-ingredient</span> + <span class="Constant">default-space</span>:array:address:location<span class="Special"> <- </span>new location:type, <span class="Constant">60:literal</span> + template:address:array:character<span class="Special"> <- </span><span class="Constant">next-ingredient</span> <span class="Comment"># compute result-len, space to allocate for result</span> tem-len:number<span class="Special"> <- </span>length template:address:array:character/deref result-len:number<span class="Special"> <- </span>copy tem-len:number <span class="Delimiter">{</span> <span class="Comment"># while arg received</span> - a:address:array:character, arg-received?:boolean<span class="Special"> <- </span><span class="Identifier">next-ingredient</span> - <span class="Identifier">break-unless</span> arg-received?:boolean + a:address:array:character, arg-received?:boolean<span class="Special"> <- </span><span class="Constant">next-ingredient</span> + <span class="muControl">break-unless</span> arg-received?:boolean <span class="Comment"># result-len = result-len + arg.length - 1 for the 'underscore' being replaced</span> a-len:number<span class="Special"> <- </span>length a:address:array:character/deref result-len:number<span class="Special"> <- </span>add result-len:number, a-len:number result-len:number<span class="Special"> <- </span>subtract result-len:number, <span class="Constant">1:literal</span> - <span class="Identifier">loop</span> + <span class="muControl">loop</span> <span class="Delimiter">}</span> <span class="CommentedCode">#? $print tem-len:number, [ ], $result-len:number, [ </span> <span class="CommentedCode">#? ] #? 1</span> rewind-ingredients - _<span class="Special"> <- </span><span class="Identifier">next-ingredient</span> <span class="Comment"># skip template</span> + _<span class="Special"> <- </span><span class="Constant">next-ingredient</span> <span class="Comment"># skip template</span> <span class="Comment"># result = new array:character[result-len]</span> result:address:array:character<span class="Special"> <- </span>new character:type, result-len:number <span class="Comment"># repeatedly copy sections of template and 'holes' into result</span> @@ -486,17 +486,17 @@ container buffer [ i:number<span class="Special"> <- </span>copy <span class="Constant">0:literal</span> <span class="Delimiter">{</span> <span class="Comment"># while arg received</span> - a:address:array:character, arg-received?:boolean<span class="Special"> <- </span><span class="Identifier">next-ingredient</span> - <span class="Identifier">break-unless</span> arg-received?:boolean + a:address:array:character, arg-received?:boolean<span class="Special"> <- </span><span class="Constant">next-ingredient</span> + <span class="muControl">break-unless</span> arg-received?:boolean <span class="Comment"># copy template into result until '_'</span> <span class="Delimiter">{</span> <span class="Comment"># while i < template.length</span> tem-done?:boolean<span class="Special"> <- </span>greater-or-equal i:number, tem-len:number - <span class="Identifier">break-if</span> tem-done?:boolean,<span class="Identifier"> +done</span>:label + <span class="muControl">break-if</span> tem-done?:boolean, <span class="Constant">+done:label</span> <span class="Comment"># while template[i] != '_'</span> in:character<span class="Special"> <- </span>index template:address:array:character/deref, i:number underscore?:boolean<span class="Special"> <- </span>equal in:character, <span class="Constant">95:literal</span> <span class="Comment"># '_'</span> - <span class="Identifier">break-if</span> underscore?:boolean + <span class="muControl">break-if</span> underscore?:boolean <span class="Comment"># result[result-idx] = template[i]</span> out:address:character<span class="Special"> <- </span>index-address result:address:array:character/deref, result-idx:number out:address:character/deref<span class="Special"> <- </span>copy in:character @@ -504,14 +504,14 @@ container buffer [ i:number<span class="Special"> <- </span>add i:number, <span class="Constant">1:literal</span> <span class="Comment"># ++result-idx</span> result-idx:number<span class="Special"> <- </span>add result-idx:number, <span class="Constant">1:literal</span> - <span class="Identifier">loop</span> + <span class="muControl">loop</span> <span class="Delimiter">}</span> <span class="Comment"># copy 'a' into result</span> j:number<span class="Special"> <- </span>copy <span class="Constant">0:literal</span> <span class="Delimiter">{</span> <span class="Comment"># while j < a.length</span> arg-done?:boolean<span class="Special"> <- </span>greater-or-equal j:number, a-len:number - <span class="Identifier">break-if</span> arg-done?:boolean + <span class="muControl">break-if</span> arg-done?:boolean <span class="Comment"># result[result-idx] = a[j]</span> in:character<span class="Special"> <- </span>index a:address:array:character/deref, j:number out:address:character<span class="Special"> <- </span>index-address result:address:array:character/deref, result-idx:number @@ -520,18 +520,18 @@ container buffer [ j:number<span class="Special"> <- </span>add j:number, <span class="Constant">1:literal</span> <span class="Comment"># ++result-idx</span> result-idx:number<span class="Special"> <- </span>add result-idx:number, <span class="Constant">1:literal</span> - <span class="Identifier">loop</span> + <span class="muControl">loop</span> <span class="Delimiter">}</span> <span class="Comment"># skip '_' in template</span> i:number<span class="Special"> <- </span>add i:number, <span class="Constant">1:literal</span> - <span class="Identifier">loop</span> <span class="Comment"># interpolate next arg</span> + <span class="muControl">loop</span> <span class="Comment"># interpolate next arg</span> <span class="Delimiter">}</span> - <span class="Identifier"> +done</span> +<span class="Constant"> +done</span> <span class="Comment"># done with holes; copy rest of template directly into result</span> <span class="Delimiter">{</span> <span class="Comment"># while i < template.length</span> tem-done?:boolean<span class="Special"> <- </span>greater-or-equal i:number, tem-len:number - <span class="Identifier">break-if</span> tem-done?:boolean + <span class="muControl">break-if</span> tem-done?:boolean <span class="Comment"># result[result-idx] = template[i]</span> in:character<span class="Special"> <- </span>index template:address:array:character/deref, i:number out:address:character<span class="Special"> <- </span>index-address result:address:array:character/deref, result-idx:number @@ -540,9 +540,9 @@ container buffer [ i:number<span class="Special"> <- </span>add i:number, <span class="Constant">1:literal</span> <span class="Comment"># ++result-idx</span> result-idx:number<span class="Special"> <- </span>add result-idx:number, <span class="Constant">1:literal</span> - <span class="Identifier">loop</span> + <span class="muControl">loop</span> <span class="Delimiter">}</span> - <span class="Identifier">reply</span> result:address:array:character + <span class="muControl">reply</span> result:address:array:character ] <span class="muScenario">scenario</span> interpolate-works [ @@ -585,88 +585,88 @@ container buffer [ <span class="Comment"># result:boolean <- space? c:character</span> <span class="muRecipe">recipe</span> space? [ - <span class="Identifier">default-space</span>:array:address:location<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span> - c:character<span class="Special"> <- </span><span class="Identifier">next-ingredient</span> + <span class="Constant">default-space</span>:array:address:location<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span> + c:character<span class="Special"> <- </span><span class="Constant">next-ingredient</span> <span class="Comment"># most common case first</span> result:boolean<span class="Special"> <- </span>equal c:character, <span class="Constant">32:literal/space</span> - <span class="Identifier">jump-if</span> result:boolean,<span class="Identifier"> +reply</span>:label + <span class="muControl">jump-if</span> result:boolean, <span class="Constant">+reply:label</span> result:boolean<span class="Special"> <- </span>equal c:character, <span class="Constant">10:literal/newline</span> - <span class="Identifier">jump-if</span> result:boolean,<span class="Identifier"> +reply</span>:label + <span class="muControl">jump-if</span> result:boolean, <span class="Constant">+reply:label</span> result:boolean<span class="Special"> <- </span>equal c:character, <span class="Constant">9:literal/tab</span> - <span class="Identifier">jump-if</span> result:boolean,<span class="Identifier"> +reply</span>:label + <span class="muControl">jump-if</span> result:boolean, <span class="Constant">+reply:label</span> result:boolean<span class="Special"> <- </span>equal c:character, <span class="Constant">13:literal/carriage-return</span> <span class="Comment"># remaining uncommon cases in sorted order</span> <span class="Comment"># <a href="http://unicode.org">http://unicode.org</a> code-points in unicode-set Z and Pattern_White_Space</span> - <span class="Identifier">jump-if</span> result:boolean,<span class="Identifier"> +reply</span>:label + <span class="muControl">jump-if</span> result:boolean, <span class="Constant">+reply:label</span> result:boolean<span class="Special"> <- </span>equal c:character, <span class="Constant">11:literal/ctrl-k</span> - <span class="Identifier">jump-if</span> result:boolean,<span class="Identifier"> +reply</span>:label + <span class="muControl">jump-if</span> result:boolean, <span class="Constant">+reply:label</span> result:boolean<span class="Special"> <- </span>equal c:character, <span class="Constant">12:literal/ctrl-l</span> - <span class="Identifier">jump-if</span> result:boolean,<span class="Identifier"> +reply</span>:label + <span class="muControl">jump-if</span> result:boolean, <span class="Constant">+reply:label</span> result:boolean<span class="Special"> <- </span>equal c:character, <span class="Constant">133:literal/ctrl-0085</span> - <span class="Identifier">jump-if</span> result:boolean,<span class="Identifier"> +reply</span>:label + <span class="muControl">jump-if</span> result:boolean, <span class="Constant">+reply:label</span> result:boolean<span class="Special"> <- </span>equal c:character, <span class="Constant">160:literal/no-break-space</span> - <span class="Identifier">jump-if</span> result:boolean,<span class="Identifier"> +reply</span>:label + <span class="muControl">jump-if</span> result:boolean, <span class="Constant">+reply:label</span> result:boolean<span class="Special"> <- </span>equal c:character, <span class="Constant">5760:literal/ogham-space-mark</span> - <span class="Identifier">jump-if</span> result:boolean,<span class="Identifier"> +reply</span>:label + <span class="muControl">jump-if</span> result:boolean, <span class="Constant">+reply:label</span> result:boolean<span class="Special"> <- </span>equal c:character, <span class="Constant">8192:literal/en-quad</span> - <span class="Identifier">jump-if</span> result:boolean,<span class="Identifier"> +reply</span>:label + <span class="muControl">jump-if</span> result:boolean, <span class="Constant">+reply:label</span> result:boolean<span class="Special"> <- </span>equal c:character, <span class="Constant">8193:literal/em-quad</span> - <span class="Identifier">jump-if</span> result:boolean,<span class="Identifier"> +reply</span>:label + <span class="muControl">jump-if</span> result:boolean, <span class="Constant">+reply:label</span> result:boolean<span class="Special"> <- </span>equal c:character, <span class="Constant">8194:literal/en-space</span> - <span class="Identifier">jump-if</span> result:boolean,<span class="Identifier"> +reply</span>:label + <span class="muControl">jump-if</span> result:boolean, <span class="Constant">+reply:label</span> result:boolean<span class="Special"> <- </span>equal c:character, <span class="Constant">8195:literal/em-space</span> - <span class="Identifier">jump-if</span> result:boolean,<span class="Identifier"> +reply</span>:label + <span class="muControl">jump-if</span> result:boolean, <span class="Constant">+reply:label</span> result:boolean<span class="Special"> <- </span>equal c:character, <span class="Constant">8196:literal/three-per-em-space</span> - <span class="Identifier">jump-if</span> result:boolean,<span class="Identifier"> +reply</span>:label + <span class="muControl">jump-if</span> result:boolean, <span class="Constant">+reply:label</span> result:boolean<span class="Special"> <- </span>equal c:character, <span class="Constant">8197:literal/four-per-em-space</span> - <span class="Identifier">jump-if</span> result:boolean,<span class="Identifier"> +reply</span>:label + <span class="muControl">jump-if</span> result:boolean, <span class="Constant">+reply:label</span> result:boolean<span class="Special"> <- </span>equal c:character, <span class="Constant">8198:literal/six-per-em-space</span> - <span class="Identifier">jump-if</span> result:boolean,<span class="Identifier"> +reply</span>:label + <span class="muControl">jump-if</span> result:boolean, <span class="Constant">+reply:label</span> result:boolean<span class="Special"> <- </span>equal c:character, <span class="Constant">8199:literal/figure-space</span> - <span class="Identifier">jump-if</span> result:boolean,<span class="Identifier"> +reply</span>:label + <span class="muControl">jump-if</span> result:boolean, <span class="Constant">+reply:label</span> result:boolean<span class="Special"> <- </span>equal c:character, <span class="Constant">8200:literal/punctuation-space</span> - <span class="Identifier">jump-if</span> result:boolean,<span class="Identifier"> +reply</span>:label + <span class="muControl">jump-if</span> result:boolean, <span class="Constant">+reply:label</span> result:boolean<span class="Special"> <- </span>equal c:character, <span class="Constant">8201:literal/thin-space</span> - <span class="Identifier">jump-if</span> result:boolean,<span class="Identifier"> +reply</span>:label + <span class="muControl">jump-if</span> result:boolean, <span class="Constant">+reply:label</span> result:boolean<span class="Special"> <- </span>equal c:character, <span class="Constant">8202:literal/hair-space</span> - <span class="Identifier">jump-if</span> result:boolean,<span class="Identifier"> +reply</span>:label + <span class="muControl">jump-if</span> result:boolean, <span class="Constant">+reply:label</span> result:boolean<span class="Special"> <- </span>equal c:character, <span class="Constant">8206:literal/left-to-right</span> - <span class="Identifier">jump-if</span> result:boolean,<span class="Identifier"> +reply</span>:label + <span class="muControl">jump-if</span> result:boolean, <span class="Constant">+reply:label</span> result:boolean<span class="Special"> <- </span>equal c:character, <span class="Constant">8207:literal/right-to-left</span> - <span class="Identifier">jump-if</span> result:boolean,<span class="Identifier"> +reply</span>:label + <span class="muControl">jump-if</span> result:boolean, <span class="Constant">+reply:label</span> result:boolean<span class="Special"> <- </span>equal c:character, <span class="Constant">8232:literal/line-separator</span> - <span class="Identifier">jump-if</span> result:boolean,<span class="Identifier"> +reply</span>:label + <span class="muControl">jump-if</span> result:boolean, <span class="Constant">+reply:label</span> result:boolean<span class="Special"> <- </span>equal c:character, <span class="Constant">8233:literal/paragraph-separator</span> - <span class="Identifier">jump-if</span> result:boolean,<span class="Identifier"> +reply</span>:label + <span class="muControl">jump-if</span> result:boolean, <span class="Constant">+reply:label</span> result:boolean<span class="Special"> <- </span>equal c:character, <span class="Constant">8239:literal/narrow-no-break-space</span> - <span class="Identifier">jump-if</span> result:boolean,<span class="Identifier"> +reply</span>:label + <span class="muControl">jump-if</span> result:boolean, <span class="Constant">+reply:label</span> result:boolean<span class="Special"> <- </span>equal c:character, <span class="Constant">8287:literal/medium-mathematical-space</span> - <span class="Identifier">jump-if</span> result:boolean,<span class="Identifier"> +reply</span>:label + <span class="muControl">jump-if</span> result:boolean, <span class="Constant">+reply:label</span> result:boolean<span class="Special"> <- </span>equal c:character, <span class="Constant">12288:literal/ideographic-space</span> - <span class="Identifier">jump-if</span> result:boolean,<span class="Identifier"> +reply</span>:label - <span class="Identifier"> +reply</span> - <span class="Identifier">reply</span> result:boolean + <span class="muControl">jump-if</span> result:boolean, <span class="Constant">+reply:label</span> +<span class="Constant"> +reply</span> + <span class="muControl">reply</span> result:boolean ] <span class="Comment"># result:address:array:character <- trim s:address:array:character</span> <span class="muRecipe">recipe</span> trim [ - <span class="Identifier">default-space</span>:array:address:location<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span> - s:address:array:character<span class="Special"> <- </span><span class="Identifier">next-ingredient</span> + <span class="Constant">default-space</span>:array:address:location<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span> + s:address:array:character<span class="Special"> <- </span><span class="Constant">next-ingredient</span> len:number<span class="Special"> <- </span>length s:address:array:character/deref <span class="Comment"># left trim: compute start</span> start:number<span class="Special"> <- </span>copy <span class="Constant">0:literal</span> <span class="Delimiter">{</span> <span class="Delimiter">{</span> at-end?:boolean<span class="Special"> <- </span>greater-or-equal start:number, len:number - <span class="Identifier">break-unless</span> at-end?:boolean + <span class="muControl">break-unless</span> at-end?:boolean result:address:array:character<span class="Special"> <- </span>new character:type, <span class="Constant">0:literal</span> - <span class="Identifier">reply</span> result:address:array:character + <span class="muControl">reply</span> result:address:array:character <span class="Delimiter">}</span> curr:character<span class="Special"> <- </span>index s:address:array:character/deref, start:number whitespace?:boolean<span class="Special"> <- </span>space? curr:character - <span class="Identifier">break-unless</span> whitespace?:boolean + <span class="muControl">break-unless</span> whitespace?:boolean start:number<span class="Special"> <- </span>add start:number, <span class="Constant">1:literal</span> - <span class="Identifier">loop</span> + <span class="muControl">loop</span> <span class="Delimiter">}</span> <span class="Comment"># right trim: compute end</span> end:number<span class="Special"> <- </span>subtract len:number, <span class="Constant">1:literal</span> @@ -675,12 +675,12 @@ container buffer [ assert not-at-start?:boolean <span class="Constant">[end ran up against start]</span> curr:character<span class="Special"> <- </span>index s:address:array:character/deref, end:number whitespace?:boolean<span class="Special"> <- </span>space? curr:character - <span class="Identifier">break-unless</span> whitespace?:boolean + <span class="muControl">break-unless</span> whitespace?:boolean end:number<span class="Special"> <- </span>subtract end:number, <span class="Constant">1:literal</span> - <span class="Identifier">loop</span> + <span class="muControl">loop</span> <span class="Delimiter">}</span> <span class="Comment"># result = new character[end+1 - start]</span> - new-len:number<span class="Special"> <- </span>subtract end:number, start:number,<span class="Identifier"> -1</span>:literal + new-len:number<span class="Special"> <- </span>subtract end:number, start:number, <span class="Constant">-1:literal</span> result:address:array:character<span class="Special"> <- </span>new character:type, new-len:number <span class="Comment"># i = start, j = 0</span> i:number<span class="Special"> <- </span>copy start:number @@ -688,7 +688,7 @@ container buffer [ <span class="Delimiter">{</span> <span class="Comment"># while i <= end</span> done?:boolean<span class="Special"> <- </span>greater-than i:number, end:number - <span class="Identifier">break-if</span> done?:boolean + <span class="muControl">break-if</span> done?:boolean <span class="Comment"># result[j] = s[i]</span> src:character<span class="Special"> <- </span>index s:address:array:character/deref, i:number dest:address:character<span class="Special"> <- </span>index-address result:address:array:character/deref, j:number @@ -696,9 +696,9 @@ container buffer [ <span class="Comment"># ++i, ++j</span> i:number<span class="Special"> <- </span>add i:number, <span class="Constant">1:literal</span> j:number<span class="Special"> <- </span>add j:number, <span class="Constant">1:literal</span> - <span class="Identifier">loop</span> + <span class="muControl">loop</span> <span class="Delimiter">}</span> - <span class="Identifier">reply</span> result:address:array:character + <span class="muControl">reply</span> result:address:array:character ] <span class="muScenario">scenario</span> trim-unmodified [ |