diff options
author | Kartik K. Agaram <vc@akkartik.com> | 2015-05-25 22:27:19 -0700 |
---|---|---|
committer | Kartik K. Agaram <vc@akkartik.com> | 2015-05-25 22:27:19 -0700 |
commit | c5ffb6e1cc9c5ff880d037c53b8ebc8562be0008 (patch) | |
tree | 2d05d987ec3c81bfbb0c1f598966d9d1b16e9b1f /html/060string.mu.html | |
parent | b2757892d553352feb59d70b1e7241ccdafa6905 (diff) | |
download | mu-c5ffb6e1cc9c5ff880d037c53b8ebc8562be0008.tar.gz |
1459
Diffstat (limited to 'html/060string.mu.html')
-rw-r--r-- | html/060string.mu.html | 282 |
1 files changed, 230 insertions, 52 deletions
diff --git a/html/060string.mu.html b/html/060string.mu.html index 193f1463..7e65e5be 100644 --- a/html/060string.mu.html +++ b/html/060string.mu.html @@ -2,7 +2,7 @@ <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> -<title>~/Desktop/s/mu/060string.mu</title> +<title>060string.mu</title> <meta name="Generator" content="Vim/7.4"> <meta name="plugin-version" content="vim7.4_v1"> <meta name="syntax" content="none"> @@ -14,6 +14,8 @@ pre { white-space: pre-wrap; font-family: monospace; color: #d0d0d0; background- body { font-family: monospace; color: #d0d0d0; background-color: #000000; } * { font-size: 1em; } .CommentedCode { color: #6c6c6c; } +.muRecipe { color: #ff8700; } +.muScenario { color: #00af00; } .Delimiter { color: #c000c0; } .Comment { color: #8080ff; } .Constant { color: #008080; } @@ -32,11 +34,11 @@ body { font-family: monospace; color: #d0d0d0; background-color: #000000; } <pre id='vimCodeElement'> <span class="Comment"># Some useful helpers for dealing with strings.</span> -recipe string-equal [ - default-space:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span> - a:address:array:character<span class="Special"> <- </span>next-ingredient +<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> a-len:number<span class="Special"> <- </span>length a:address:array:character/deref - b:address:array:character<span class="Special"> <- </span>next-ingredient + b:address:array:character<span class="Special"> <- </span><span class="Identifier">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> @@ -64,9 +66,9 @@ recipe string-equal [ <span class="Identifier">reply</span> <span class="Constant">1:literal</span> ] -scenario string-equal-reflexive [ +<span class="muScenario">scenario</span> string-equal-reflexive [ run [ - default-space:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span> + <span class="Identifier">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 ] @@ -75,9 +77,9 @@ scenario string-equal-reflexive [ ] ] -scenario string-equal-identical [ +<span class="muScenario">scenario</span> string-equal-identical [ run [ - default-space:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span> + <span class="Identifier">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 @@ -87,9 +89,9 @@ scenario string-equal-identical [ ] ] -scenario string-equal-distinct-lengths [ +<span class="muScenario">scenario</span> string-equal-distinct-lengths [ run [ - default-space:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span> + <span class="Identifier">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 @@ -105,9 +107,9 @@ scenario string-equal-distinct-lengths [ ] ] -scenario string-equal-with-empty [ +<span class="muScenario">scenario</span> string-equal-with-empty [ run [ - default-space:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span> + <span class="Identifier">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 @@ -117,9 +119,9 @@ scenario string-equal-with-empty [ ] ] -scenario string-equal-common-lengths-but-distinct [ +<span class="muScenario">scenario</span> string-equal-common-lengths-but-distinct [ run [ - default-space:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span> + <span class="Identifier">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 @@ -135,24 +137,24 @@ container buffer [ data:address:array:character ] -recipe init-buffer [ - default-space:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span> +<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="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>next-ingredient + capacity:number<span class="Special"> <- </span><span class="Identifier">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 ] -recipe grow-buffer [ - default-space:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span> - in:address:buffer<span class="Special"> <- </span>next-ingredient +<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="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 @@ -173,9 +175,9 @@ recipe grow-buffer [ <span class="Identifier">reply</span> in:address:buffer ] -recipe buffer-full? [ - default-space:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span> - in:address:buffer<span class="Special"> <- </span>next-ingredient +<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> 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 @@ -184,10 +186,10 @@ recipe buffer-full? [ ] <span class="Comment"># in:address:buffer <- buffer-append in:address:buffer, c:character</span> -recipe buffer-append [ - default-space:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span> - in:address:buffer<span class="Special"> <- </span>next-ingredient - c:character<span class="Special"> <- </span>next-ingredient +<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="Delimiter">{</span> <span class="Comment"># grow buffer if necessary</span> full?:boolean<span class="Special"> <- </span>buffer-full? in:address:buffer @@ -202,9 +204,9 @@ recipe buffer-append [ <span class="Identifier">reply</span> in:address:buffer/same-as-ingredient:0 ] -scenario buffer-append-works [ +<span class="muScenario">scenario</span> buffer-append-works [ run [ - default-space:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span> + <span class="Identifier">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> @@ -255,9 +257,9 @@ scenario buffer-append-works [ ] <span class="Comment"># result:address:array:character <- integer-to-decimal-string n:number</span> -recipe integer-to-decimal-string [ - default-space:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span> - n:number<span class="Special"> <- </span>next-ingredient +<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="Comment"># is it zero?</span> <span class="Delimiter">{</span> <span class="Identifier">break-if</span> n:number @@ -311,7 +313,7 @@ recipe integer-to-decimal-string [ <span class="Identifier">reply</span> result:address:array:character ] -scenario integer-to-decimal-digit-zero [ +<span class="muScenario">scenario</span> integer-to-decimal-digit-zero [ run [ 1:address:array:character/<span class="Special">raw <- </span>integer-to-decimal-string <span class="Constant">0:literal</span> 2:array:character/<span class="Special">raw <- </span>copy 1:address:array:character/deref/<span class="Special">raw</span> @@ -321,7 +323,7 @@ scenario integer-to-decimal-digit-zero [ ] ] -scenario integer-to-decimal-digit-positive [ +<span class="muScenario">scenario</span> integer-to-decimal-digit-positive [ run [ 1:address:array:character/<span class="Special">raw <- </span>integer-to-decimal-string <span class="Constant">234:literal</span> 2:array:character/<span class="Special">raw <- </span>copy 1:address:array:character/deref/<span class="Special">raw</span> @@ -331,7 +333,7 @@ scenario integer-to-decimal-digit-positive [ ] ] -scenario integer-to-decimal-digit-negative [ +<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 2:array:character/<span class="Special">raw <- </span>copy 1:address:array:character/deref/<span class="Special">raw</span> @@ -343,12 +345,13 @@ scenario integer-to-decimal-digit-negative [ ] ] -recipe string-append [ - default-space:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span> - <span class="Comment"># result = new string[a.length + b.length]</span> - a:address:array:character<span class="Special"> <- </span>next-ingredient +<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="Comment"># result = new character[a.length + b.length]</span> + a:address:array:character<span class="Special"> <- </span><span class="Identifier">next-ingredient</span> a-len:number<span class="Special"> <- </span>length a:address:array:character/deref - b:address:array:character<span class="Special"> <- </span>next-ingredient + b:address:array:character<span class="Special"> <- </span><span class="Identifier">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 @@ -388,7 +391,7 @@ recipe string-append [ <span class="Identifier">reply</span> result:address:array:character ] -scenario string-append-1 [ +<span class="muScenario">scenario</span> string-append-1 [ run [ 1:address:array:character/<span class="Special">raw <- </span>new <span class="Constant">[hello,]</span> 2:address:array:character/<span class="Special">raw <- </span>new <span class="Constant">[ world!]</span> @@ -402,15 +405,15 @@ scenario string-append-1 [ <span class="Comment"># replace underscores in first with remaining args</span> <span class="Comment"># result:address:array:character <- interpolate template:address:array:character, ...</span> -recipe interpolate [ - default-space:array:address:location<span class="Special"> <- </span>new location:type, <span class="Constant">60:literal</span> - template:address:array:character<span class="Special"> <- </span>next-ingredient +<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="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>next-ingredient + 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 <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 @@ -421,7 +424,7 @@ recipe interpolate [ <span class="CommentedCode">#? $print tem-len:number, [ ], $result-len:number, [ </span> <span class="CommentedCode">#? ] #? 1</span> rewind-ingredients - _<span class="Special"> <- </span>next-ingredient <span class="Comment"># skip template</span> + _<span class="Special"> <- </span><span class="Identifier">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> @@ -429,13 +432,13 @@ recipe interpolate [ 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>next-ingredient + 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 <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, 2:blocks + <span class="Identifier">break-if</span> tem-done?:boolean,<span class="Identifier"> +done</span>:label <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> @@ -469,6 +472,7 @@ recipe interpolate [ 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="Delimiter">}</span> + <span class="Identifier"> +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> @@ -487,7 +491,7 @@ recipe interpolate [ <span class="Identifier">reply</span> result:address:array:character ] -scenario interpolate-works [ +<span class="muScenario">scenario</span> interpolate-works [ <span class="CommentedCode">#? dump run #? 1</span> run [ 1:address:array:character/<span class="Special">raw <- </span>new <span class="Constant">[abc _]</span> @@ -500,7 +504,7 @@ scenario interpolate-works [ ] ] -scenario interpolate-at-start [ +<span class="muScenario">scenario</span> interpolate-at-start [ run [ 1:address:array:character/<span class="Special">raw <- </span>new <span class="Constant">[_, hello!]</span> 2:address:array:character/<span class="Special">raw <- </span>new <span class="Constant">[abc]</span> @@ -513,7 +517,7 @@ scenario interpolate-at-start [ ] ] -scenario interpolate-at-end [ +<span class="muScenario">scenario</span> interpolate-at-end [ run [ 1:address:array:character/<span class="Special">raw <- </span>new <span class="Constant">[hello, _]</span> 2:address:array:character/<span class="Special">raw <- </span>new <span class="Constant">[abc]</span> @@ -524,6 +528,180 @@ scenario interpolate-at-end [ 4:string<span class="Special"> <- </span><span class="Constant">[hello, abc]</span> ] ] + +<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="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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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="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> + 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 + 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="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 + start:number<span class="Special"> <- </span>add start:number, <span class="Constant">1:literal</span> + <span class="Identifier">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> + <span class="Delimiter">{</span> + not-at-start?:boolean<span class="Special"> <- </span>greater-than end:number, start:number + 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 + end:number<span class="Special"> <- </span>subtract end:number, <span class="Constant">1:literal</span> + <span class="Identifier">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 + 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 + j:number<span class="Special"> <- </span>copy <span class="Constant">0:literal</span> + <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="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 + dest:address:character/deref<span class="Special"> <- </span>copy src:character + <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="Delimiter">}</span> + <span class="Identifier">reply</span> result:address:array:character +] + +<span class="muScenario">scenario</span> trim-unmodified [ + run [ + 1:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abc]</span> + 2:address:array:character<span class="Special"> <- </span>trim 1:address:array:character + 3:array:character<span class="Special"> <- </span>copy 2:address:array:character/deref + ] + memory-should-contain [ + 3:string<span class="Special"> <- </span><span class="Constant">[abc]</span> + ] +] + +<span class="muScenario">scenario</span> trim-left [ + run [ + 1:address:array:character<span class="Special"> <- </span>new <span class="Constant">[ abc]</span> + 2:address:array:character<span class="Special"> <- </span>trim 1:address:array:character + 3:array:character<span class="Special"> <- </span>copy 2:address:array:character/deref + ] + memory-should-contain [ + 3:string<span class="Special"> <- </span><span class="Constant">[abc]</span> + ] +] + +<span class="muScenario">scenario</span> trim-right [ + run [ + 1:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abc ]</span> + 2:address:array:character<span class="Special"> <- </span>trim 1:address:array:character + 3:array:character<span class="Special"> <- </span>copy 2:address:array:character/deref + ] + memory-should-contain [ + 3:string<span class="Special"> <- </span><span class="Constant">[abc]</span> + ] +] + +<span class="muScenario">scenario</span> trim-left-right [ + run [ + 1:address:array:character<span class="Special"> <- </span>new <span class="Constant">[ abc ]</span> + 2:address:array:character<span class="Special"> <- </span>trim 1:address:array:character + 3:array:character<span class="Special"> <- </span>copy 2:address:array:character/deref + ] + memory-should-contain [ + 3:string<span class="Special"> <- </span><span class="Constant">[abc]</span> + ] +] + +<span class="muScenario">scenario</span> trim-newline-tab [ + run [ + 1:address:array:character<span class="Special"> <- </span>new <span class="Constant">[ abc</span> +<span class="Constant">]</span> + 2:address:array:character<span class="Special"> <- </span>trim 1:address:array:character + 3:array:character<span class="Special"> <- </span>copy 2:address:array:character/deref + ] + memory-should-contain [ + 3:string<span class="Special"> <- </span><span class="Constant">[abc]</span> + ] +] </pre> </body> </html> |