summary refs log tree commit diff stats
path: root/doc/pydoc/ranger.fsobject.html
blob: 885c6a87da80b6e0dee4e9590e7bfc4a09ff9743 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html><head><title>Python: package ranger.fsobject</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head><body bgcolor="#f0f0f8">

<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="heading">
<tr bgcolor="#7799ee">
<td valign=bottom>&nbsp;<br>
<font color="#ffffff" face="helvetica, arial">&nbsp;<br><big><big><strong><a href="ranger.html"><font color="#ffffff">ranger</font></a>.fsobject</strong></big></big></font></td
><td align=right valign=bottom
><font color="#ffffff" face="helvetica, arial"><a href=".">index</a><br><a href="file:/home/hut/work/ranger/ranger/fsobject/__init__.py">/home/hut/work/ranger/ranger/fsobject/__init__.py</a></font></td></tr></table>
    <p><tt>FileSystemObjects&nbsp;are&nbsp;representation&nbsp;of&nbsp;files&nbsp;and&nbsp;directories<br>
with&nbsp;fast&nbsp;access&nbsp;to&nbsp;their&nbsp;properties&nbsp;through&nbsp;caching</tt></p>
<p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#aa55cc">
<td colspan=3 valign=bottom>&nbsp;<br>
<font color="#ffffff" face="helvetica, arial"><big><strong>Package Contents</strong></big></font></td></tr>
    
<tr><td bgcolor="#aa55cc"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
<td width="100%"><table width="100%" summary="list"><tr><td width="25%" valign=top><a href="ranger.fsobject.directory.html">directory</a><br>
</td><td width="25%" valign=top><a href="ranger.fsobject.file.html">file</a><br>
</td><td width="25%" valign=top><a href="ranger.fsobject.fsobject.html">fsobject</a><br>
</td><td width="25%" valign=top><a href="ranger.fsobject.loader.html">loader</a><br>
</td></tr></table></td></tr></table><p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#ee77aa">
<td colspan=3 valign=bottom>&nbsp;<br>
<font color="#ffffff" face="helvetica, arial"><big><strong>Classes</strong></big></font></td></tr>
    
<tr><td bgcolor="#ee77aa"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
<td width="100%"><dl>
<dt><font face="helvetica, arial"><a href="builtins.html#Exception">builtins.Exception</a>(<a href="builtins.html#BaseException">builtins.BaseException</a>)
</font></dt><dd>
<dl>
<dt><font face="helvetica, arial"><a href="ranger.fsobject.html#NotLoadedYet">NotLoadedYet</a>
</font></dt></dl>
</dd>
</dl>
 <p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#ffc8d8">
<td colspan=3 valign=bottom>&nbsp;<br>
<font color="#000000" face="helvetica, arial"><a name="NotLoadedYet">class <strong>NotLoadedYet</strong></a>(<a href="builtins.html#Exception">builtins.Exception</a>)</font></td></tr>
    
<tr><td bgcolor="#ffc8d8"><tt>&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
<td width="100%"><dl><dt>Method resolution order:</dt>
<dd><a href="ranger.fsobject.html#NotLoadedYet">NotLoadedYet</a></dd>
<dd><a href="builtins.html#Exception">builtins.Exception</a></dd>
<dd><a href="builtins.html#BaseException">builtins.BaseException</a></dd>
<dd><a href="builtins.html#object">builtins.object</a></dd>
</dl>
<hr>
Data descriptors defined here:<br>
<dl><dt><strong>__weakref__</strong></dt>
<dd><tt>list&nbsp;of&nbsp;weak&nbsp;references&nbsp;to&nbsp;the&nbsp;object&nbsp;(if&nbsp;defined)</tt></dd>
</dl>
<hr>
Methods inherited from <a href="builtins.html#Exception">builtins.Exception</a>:<br>
<dl><dt><a name="NotLoadedYet-__init__"><strong>__init__</strong></a>(...)</dt><dd><tt>x.<a href="#NotLoadedYet-__init__">__init__</a>(...)&nbsp;initializes&nbsp;x;&nbsp;see&nbsp;x.__class__.__doc__&nbsp;for&nbsp;signature</tt></dd></dl>

<hr>
Data and other attributes inherited from <a href="builtins.html#Exception">builtins.Exception</a>:<br>
<dl><dt><strong>__new__</strong> = &lt;built-in method __new__ of type object at 0x7f6a9223e120&gt;<dd><tt>T.<a href="#NotLoadedYet-__new__">__new__</a>(S,&nbsp;...)&nbsp;-&gt;&nbsp;a&nbsp;new&nbsp;object&nbsp;with&nbsp;type&nbsp;S,&nbsp;a&nbsp;subtype&nbsp;of&nbsp;T</tt></dl>

<hr>
Methods inherited from <a href="builtins.html#BaseException">builtins.BaseException</a>:<br>
<dl><dt><a name="NotLoadedYet-__delattr__"><strong>__delattr__</strong></a>(...)</dt><dd><tt>x.<a href="#NotLoadedYet-__delattr__">__delattr__</a>('name')&nbsp;&lt;==&gt;&nbsp;del&nbsp;x.name</tt></dd></dl>

<dl><dt><a name="NotLoadedYet-__getattribute__"><strong>__getattribute__</strong></a>(...)</dt><dd><tt>x.<a href="#NotLoadedYet-__getattribute__">__getattribute__</a>('name')&nbsp;&lt;==&gt;&nbsp;x.name</tt></dd></dl>

<dl><dt><a name="NotLoadedYet-__reduce__"><strong>__reduce__</strong></a>(...)</dt></dl>

<dl><dt><a name="NotLoadedYet-__repr__"><strong>__repr__</strong></a>(...)</dt><dd><tt>x.<a href="#NotLoadedYet-__repr__">__repr__</a>()&nbsp;&lt;==&gt;&nbsp;repr(x)</tt></dd></dl>

<dl><dt><a name="NotLoadedYet-__setattr__"><strong>__setattr__</strong></a>(...)</dt><dd><tt>x.<a href="#NotLoadedYet-__setattr__">__setattr__</a>('name',&nbsp;value)&nbsp;&lt;==&gt;&nbsp;x.name&nbsp;=&nbsp;value</tt></dd></dl>

<dl><dt><a name="NotLoadedYet-__setstate__"><strong>__setstate__</strong></a>(...)</dt></dl>

<dl><dt><a name="NotLoadedYet-__str__"><strong>__str__</strong></a>(...)</dt><dd><tt>x.<a href="#NotLoadedYet-__str__">__str__</a>()&nbsp;&lt;==&gt;&nbsp;str(x)</tt></dd></dl>

<dl><dt><a name="NotLoadedYet-with_traceback"><strong>with_traceback</strong></a>(...)</dt><dd><tt><a href="builtins.html#Exception">Exception</a>.<a href="#NotLoadedYet-with_traceback">with_traceback</a>(tb)&nbsp;--<br>
set&nbsp;self.<strong>__traceback__</strong>&nbsp;to&nbsp;tb&nbsp;and&nbsp;return&nbsp;self.</tt></dd></dl>

<hr>
Data descriptors inherited from <a href="builtins.html#BaseException">builtins.BaseException</a>:<br>
<dl><dt><strong>__cause__</strong></dt>
<dd><tt>exception&nbsp;cause</tt></dd>
</dl>
<dl><dt><strong>__context__</strong></dt>
<dd><tt>exception&nbsp;context</tt></dd>
</dl>
<dl><dt><strong>__dict__</strong></dt>
</dl>
<dl><dt><strong>__traceback__</strong></dt>
</dl>
<dl><dt><strong>args</strong></dt>
</dl>
</td></tr></table></td></tr></table><p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#55aa55">
<td colspan=3 valign=bottom>&nbsp;<br>
<font color="#ffffff" face="helvetica, arial"><big><strong>Data</strong></big></font></td></tr>
    
<tr><td bgcolor="#55aa55"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
<td width="100%"><strong>BAD_INFO</strong> = None<br>
<strong>T_DIRECTORY</strong> = 'directory'<br>
<strong>T_FILE</strong> = 'file'<br>
<strong>T_NONEXISTANT</strong> = 'nonexistant'<br>
<strong>T_UNKNOWN</strong> = 'unknown'</td></tr></table>
</body></html>
>span> <span class="Comment"># reset cursor</span> x:address:number<span class="Special"> &lt;- </span>get-address *sc, <span class="Constant">cursor-row:offset</span> *x<span class="Special"> &lt;- </span>copy <span class="Constant">0</span> x<span class="Special"> &lt;- </span>get-address *sc, <span class="Constant">cursor-column:offset</span> *x<span class="Special"> &lt;- </span>copy <span class="Constant">0</span> <span class="muControl">reply</span> sc/same-as-ingredient:<span class="Constant">0</span> <span class="Delimiter">}</span> <span class="Comment"># otherwise, real screen</span> clear-display <span class="muControl">reply</span> sc/same-as-ingredient:<span class="Constant">0</span> ] <span class="muRecipe">recipe</span> fake-screen-is-empty? [ <span class="Constant">local-scope</span> sc:address:screen<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span> <span class="muControl">reply-unless</span> sc, <span class="Constant">1/true</span> buf:address:array:screen-cell<span class="Special"> &lt;- </span>get *sc, <span class="Constant">data:offset</span> i:number<span class="Special"> &lt;- </span>copy <span class="Constant">0</span> len:number<span class="Special"> &lt;- </span>length *buf <span class="Delimiter">{</span> done?:boolean<span class="Special"> &lt;- </span>greater-or-equal i, len <span class="muControl">break-if</span> done? curr:screen-cell<span class="Special"> &lt;- </span>index *buf, i curr-contents:character<span class="Special"> &lt;- </span>get curr, <span class="Constant">contents:offset</span> i<span class="Special"> &lt;- </span>add i, <span class="Constant">1</span> <span class="muControl">loop-unless</span> curr-contents <span class="Comment"># not 0</span> <span class="muControl">reply</span> <span class="Constant">0/false</span> <span class="Delimiter">}</span> <span class="muControl">reply</span> <span class="Constant">1/true</span> ] <span class="muRecipe">recipe</span> print-character [ <span class="Constant">local-scope</span> sc:address:screen<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span> c:character<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span> color:number, color-found?:boolean<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span> <span class="Delimiter">{</span> <span class="Comment"># default color to white</span> <span class="muControl">break-if</span> color-found? color<span class="Special"> &lt;- </span>copy <span class="Constant">7/white</span> <span class="Delimiter">}</span> bg-color:number, bg-color-found?:boolean<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span> <span class="Delimiter">{</span> <span class="Comment"># default bg-color to black</span> <span class="muControl">break-if</span> bg-color-found? bg-color<span class="Special"> &lt;- </span>copy <span class="Constant">0/black</span> <span class="Delimiter">}</span> <span class="CommentedCode">#? trace [app], [print character] #? 1</span> <span class="Delimiter">{</span> <span class="Comment"># if x exists</span> <span class="Comment"># (handle special cases exactly like in the real screen)</span> <span class="muControl">break-unless</span> sc width:number<span class="Special"> &lt;- </span>get *sc, <span class="Constant">num-columns:offset</span> height:number<span class="Special"> &lt;- </span>get *sc, <span class="Constant">num-rows:offset</span> <span class="Comment"># if cursor is out of bounds, silently exit</span> row:address:number<span class="Special"> &lt;- </span>get-address *sc, <span class="Constant">cursor-row:offset</span> legal?:boolean<span class="Special"> &lt;- </span>greater-or-equal *row, <span class="Constant">0</span> <span class="muControl">reply-unless</span> legal?, sc legal?<span class="Special"> &lt;- </span>lesser-than *row, height <span class="muControl">reply-unless</span> legal?, sc column:address:number<span class="Special"> &lt;- </span>get-address *sc, <span class="Constant">cursor-column:offset</span> legal?<span class="Special"> &lt;- </span>greater-or-equal *column, <span class="Constant">0</span> <span class="muControl">reply-unless</span> legal?, sc legal?<span class="Special"> &lt;- </span>lesser-than *column, width <span class="muControl">reply-unless</span> legal?, sc <span class="Comment"># special-case: newline</span> <span class="Delimiter">{</span> newline?:boolean<span class="Special"> &lt;- </span>equal c, <span class="Constant">10/newline</span> <span class="CommentedCode">#? $print c, [ ], newline?, 10/newline</span> <span class="muControl">break-unless</span> newline? <span class="Delimiter">{</span> <span class="Comment"># unless cursor is already at bottom</span> bottom:number<span class="Special"> &lt;- </span>subtract height, <span class="Constant">1</span> at-bottom?:boolean<span class="Special"> &lt;- </span>greater-or-equal *row, bottom <span class="muControl">break-if</span> at-bottom? <span class="Comment"># move it to the next row</span> *column<span class="Special"> &lt;- </span>copy <span class="Constant">0</span> *row<span class="Special"> &lt;- </span>add *row, <span class="Constant">1</span> <span class="Delimiter">}</span> <span class="muControl">reply</span> sc/same-as-ingredient:<span class="Constant">0</span> <span class="Delimiter">}</span> <span class="Comment"># save character in fake screen</span> index:number<span class="Special"> &lt;- </span>multiply *row, width index<span class="Special"> &lt;- </span>add index, *column buf:address:array:screen-cell<span class="Special"> &lt;- </span>get *sc, <span class="Constant">data:offset</span> len:number<span class="Special"> &lt;- </span>length *buf <span class="Comment"># special-case: backspace</span> <span class="Delimiter">{</span> backspace?:boolean<span class="Special"> &lt;- </span>equal c, <span class="Constant">8</span> <span class="muControl">break-unless</span> backspace? <span class="Delimiter">{</span> <span class="Comment"># unless cursor is already at left margin</span> at-left?:boolean<span class="Special"> &lt;- </span>lesser-or-equal *column, <span class="Constant">0</span> <span class="muControl">break-if</span> at-left? <span class="Comment"># clear previous location</span> *column<span class="Special"> &lt;- </span>subtract *column, <span class="Constant">1</span> index<span class="Special"> &lt;- </span>subtract index, <span class="Constant">1</span> cursor:address:screen-cell<span class="Special"> &lt;- </span>index-address *buf, index cursor-contents:address:character<span class="Special"> &lt;- </span>get-address *cursor, <span class="Constant">contents:offset</span> *cursor-contents<span class="Special"> &lt;- </span>copy <span class="Constant">32/space</span> cursor-color:address:number<span class="Special"> &lt;- </span>get-address *cursor, <span class="Constant">color:offset</span> *cursor-color<span class="Special"> &lt;- </span>copy <span class="Constant">7/white</span> <span class="Delimiter">}</span> <span class="muControl">reply</span> sc/same-as-ingredient:<span class="Constant">0</span> <span class="Delimiter">}</span> <span class="CommentedCode">#? $print [saving character ], c, [ to fake screen ], cursor, 10/newline</span> cursor:address:screen-cell<span class="Special"> &lt;- </span>index-address *buf, index cursor-contents:address:character<span class="Special"> &lt;- </span>get-address *cursor, <span class="Constant">contents:offset</span> *cursor-contents<span class="Special"> &lt;- </span>copy c cursor-color:address:number<span class="Special"> &lt;- </span>get-address *cursor, <span class="Constant">color:offset</span> *cursor-color<span class="Special"> &lt;- </span>copy color <span class="Comment"># increment column unless it's already all the way to the right</span> <span class="Delimiter">{</span> right:number<span class="Special"> &lt;- </span>subtract width, <span class="Constant">1</span> at-right?:boolean<span class="Special"> &lt;- </span>greater-or-equal *column, right <span class="muControl">break-if</span> at-right? *column<span class="Special"> &lt;- </span>add *column, <span class="Constant">1</span> <span class="Delimiter">}</span> <span class="muControl">reply</span> sc/same-as-ingredient:<span class="Constant">0</span> <span class="Delimiter">}</span> <span class="Comment"># otherwise, real screen</span> print-character-to-display c, color, bg-color <span class="muControl">reply</span> sc/same-as-ingredient:<span class="Constant">0</span> ] <span class="muScenario">scenario</span> print-character-at-top-left [ run [ <span class="CommentedCode">#? $start-tracing #? 3</span> <span class="Constant">1</span>:address:screen<span class="Special"> &lt;- </span>new-fake-screen <span class="Constant">3/width</span>, <span class="Constant">2/height</span> <span class="Constant">1</span>:address:screen<span class="Special"> &lt;- </span>print-character <span class="Constant">1</span>:address:screen, <span class="Constant">97</span> <span class="Comment"># 'a'</span> <span class="Constant">2</span>:address:array:screen-cell<span class="Special"> &lt;- </span>get *<span class="Constant">1</span>:address:screen, <span class="Constant">data:offset</span> <span class="Constant">3</span>:array:screen-cell<span class="Special"> &lt;- </span>copy *<span class="Constant">2</span>:address:array:screen-cell ] memory-should-contain [ <span class="Constant">3</span><span class="Special"> &lt;- </span><span class="Constant">6</span> <span class="Comment"># width*height</span> <span class="Constant">4</span><span class="Special"> &lt;- </span><span class="Constant">97</span> <span class="Comment"># 'a'</span> <span class="Constant">5</span><span class="Special"> &lt;- </span><span class="Constant">7</span> <span class="Comment"># white</span> <span class="Constant">6</span><span class="Special"> &lt;- </span><span class="Constant">0</span> ] ] <span class="muScenario">scenario</span> print-character-color [ run [ <span class="Constant">1</span>:address:screen<span class="Special"> &lt;- </span>new-fake-screen <span class="Constant">3/width</span>, <span class="Constant">2/height</span> <span class="Constant">1</span>:address:screen<span class="Special"> &lt;- </span>print-character <span class="Constant">1</span>:address:screen, <span class="Constant">97/a</span>, <span class="Constant">1/red</span> <span class="Constant">2</span>:address:array:screen-cell<span class="Special"> &lt;- </span>get *<span class="Constant">1</span>:address:screen, <span class="Constant">data:offset</span> <span class="Constant">3</span>:array:screen-cell<span class="Special"> &lt;- </span>copy *<span class="Constant">2</span>:address:array:screen-cell ] memory-should-contain [ <span class="Constant">3</span><span class="Special"> &lt;- </span><span class="Constant">6</span> <span class="Comment"># width*height</span> <span class="Constant">4</span><span class="Special"> &lt;- </span><span class="Constant">97</span> <span class="Comment"># 'a'</span> <span class="Constant">5</span><span class="Special"> &lt;- </span><span class="Constant">1</span> <span class="Comment"># red</span> <span class="Constant">6</span><span class="Special"> &lt;- </span><span class="Constant">0</span> ] ] <span class="muScenario">scenario</span> print-backspace-character [ run [ <span class="CommentedCode">#? $start-tracing #? 3</span> <span class="Constant">1</span>:address:screen<span class="Special"> &lt;- </span>new-fake-screen <span class="Constant">3/width</span>, <span class="Constant">2/height</span> <span class="Constant">1</span>:address:screen<span class="Special"> &lt;- </span>print-character <span class="Constant">1</span>:address:screen, <span class="Constant">97</span> <span class="Comment"># 'a'</span> <span class="Constant">1</span>:address:screen<span class="Special"> &lt;- </span>print-character <span class="Constant">1</span>:address:screen, <span class="Constant">8</span> <span class="Comment"># backspace</span> <span class="Constant">2</span>:number<span class="Special"> &lt;- </span>get *<span class="Constant">1</span>:address:screen, <span class="Constant">cursor-column:offset</span> <span class="Constant">3</span>:address:array:screen-cell<span class="Special"> &lt;- </span>get *<span class="Constant">1</span>:address:screen, <span class="Constant">data:offset</span> <span class="Constant">4</span>:array:screen-cell<span class="Special"> &lt;- </span>copy *<span class="Constant">3</span>:address:array:screen-cell ] memory-should-contain [ <span class="Constant">2</span><span class="Special"> &lt;- </span><span class="Constant">0</span> <span class="Comment"># cursor column</span> <span class="Constant">4</span><span class="Special"> &lt;- </span><span class="Constant">6</span> <span class="Comment"># width*height</span> <span class="Constant">5</span><span class="Special"> &lt;- </span><span class="Constant">32</span> <span class="Comment"># space, not 'a'</span> <span class="Constant">6</span><span class="Special"> &lt;- </span><span class="Constant">7</span> <span class="Comment"># white</span> <span class="Constant">7</span><span class="Special"> &lt;- </span><span class="Constant">0</span> ] ] <span class="muScenario">scenario</span> print-extra-backspace-character [ run [ <span class="Constant">1</span>:address:screen<span class="Special"> &lt;- </span>new-fake-screen <span class="Constant">3/width</span>, <span class="Constant">2/height</span> <span class="Constant">1</span>:address:screen<span class="Special"> &lt;- </span>print-character <span class="Constant">1</span>:address:screen, <span class="Constant">97</span> <span class="Comment"># 'a'</span> <span class="Constant">1</span>:address:screen<span class="Special"> &lt;- </span>print-character <span class="Constant">1</span>:address:screen, <span class="Constant">8</span> <span class="Comment"># backspace</span> <span class="Constant">1</span>:address:screen<span class="Special"> &lt;- </span>print-character <span class="Constant">1</span>:address:screen, <span class="Constant">8</span> <span class="Comment"># backspace</span> <span class="Constant">2</span>:number<span class="Special"> &lt;- </span>get *<span class="Constant">1</span>:address:screen, <span class="Constant">cursor-column:offset</span> <span class="Constant">3</span>:address:array:screen-cell<span class="Special"> &lt;- </span>get *<span class="Constant">1</span>:address:screen, <span class="Constant">data:offset</span> <span class="Constant">4</span>:array:screen-cell<span class="Special"> &lt;- </span>copy *<span class="Constant">3</span>:address:array:screen-cell ] memory-should-contain [ <span class="Constant">2</span><span class="Special"> &lt;- </span><span class="Constant">0</span> <span class="Comment"># cursor column</span> <span class="Constant">4</span><span class="Special"> &lt;- </span><span class="Constant">6</span> <span class="Comment"># width*height</span> <span class="Constant">5</span><span class="Special"> &lt;- </span><span class="Constant">32</span> <span class="Comment"># space, not 'a'</span> <span class="Constant">6</span><span class="Special"> &lt;- </span><span class="Constant">7</span> <span class="Comment"># white</span> <span class="Constant">7</span><span class="Special"> &lt;- </span><span class="Constant">0</span> ] ] <span class="muScenario">scenario</span> print-at-right-margin [ run [ <span class="Constant">1</span>:address:screen<span class="Special"> &lt;- </span>new-fake-screen <span class="Constant">2/width</span>, <span class="Constant">2/height</span> <span class="Constant">1</span>:address:screen<span class="Special"> &lt;- </span>print-character <span class="Constant">1</span>:address:screen, <span class="Constant">97</span> <span class="Comment"># 'a'</span> <span class="Constant">1</span>:address:screen<span class="Special"> &lt;- </span>print-character <span class="Constant">1</span>:address:screen, <span class="Constant">98</span> <span class="Comment"># 'b'</span> <span class="Constant">1</span>:address:screen<span class="Special"> &lt;- </span>print-character <span class="Constant">1</span>:address:screen, <span class="Constant">99</span> <span class="Comment"># 'c'</span> <span class="Constant">2</span>:number<span class="Special"> &lt;- </span>get *<span class="Constant">1</span>:address:screen, <span class="Constant">cursor-column:offset</span> <span class="Constant">3</span>:address:array:screen-cell<span class="Special"> &lt;- </span>get *<span class="Constant">1</span>:address:screen, <span class="Constant">data:offset</span> <span class="Constant">4</span>:array:screen-cell<span class="Special"> &lt;- </span>copy *<span class="Constant">3</span>:address:array:screen-cell ] memory-should-contain [ <span class="Constant">2</span><span class="Special"> &lt;- </span><span class="Constant">1</span> <span class="Comment"># cursor column</span> <span class="Constant">4</span><span class="Special"> &lt;- </span><span class="Constant">4</span> <span class="Comment"># width*height</span> <span class="Constant">5</span><span class="Special"> &lt;- </span><span class="Constant">97</span> <span class="Comment"># 'a'</span> <span class="Constant">6</span><span class="Special"> &lt;- </span><span class="Constant">7</span> <span class="Comment"># white</span> <span class="Constant">7</span><span class="Special"> &lt;- </span><span class="Constant">99</span> <span class="Comment"># 'c' over 'b'</span> <span class="Constant">8</span><span class="Special"> &lt;- </span><span class="Constant">7</span> <span class="Comment"># white</span> <span class="Constant">9</span><span class="Special"> &lt;- </span><span class="Constant">0</span> ] ] <span class="muScenario">scenario</span> print-newline-character [ run [ <span class="CommentedCode">#? $start-tracing #? 3</span> <span class="Constant">1</span>:address:screen<span class="Special"> &lt;- </span>new-fake-screen <span class="Constant">3/width</span>, <span class="Constant">2/height</span> <span class="Constant">1</span>:address:screen<span class="Special"> &lt;- </span>print-character <span class="Constant">1</span>:address:screen, <span class="Constant">97</span> <span class="Comment"># 'a'</span> <span class="Constant">1</span>:address:screen<span class="Special"> &lt;- </span>print-character <span class="Constant">1</span>:address:screen, <span class="Constant">10/newline</span> <span class="Constant">2</span>:number<span class="Special"> &lt;- </span>get *<span class="Constant">1</span>:address:screen, <span class="Constant">cursor-row:offset</span> <span class="Constant">3</span>:number<span class="Special"> &lt;- </span>get *<span class="Constant">1</span>:address:screen, <span class="Constant">cursor-column:offset</span> <span class="Constant">4</span>:address:array:screen-cell<span class="Special"> &lt;- </span>get *<span class="Constant">1</span>:address:screen, <span class="Constant">data:offset</span> <span class="Constant">5</span>:array:screen-cell<span class="Special"> &lt;- </span>copy *<span class="Constant">4</span>:address:array:screen-cell ] memory-should-contain [ <span class="Constant">2</span><span class="Special"> &lt;- </span><span class="Constant">1</span> <span class="Comment"># cursor row</span> <span class="Constant">3</span><span class="Special"> &lt;- </span><span class="Constant">0</span> <span class="Comment"># cursor column</span> <span class="Constant">5</span><span class="Special"> &lt;- </span><span class="Constant">6</span> <span class="Comment"># width*height</span> <span class="Constant">6</span><span class="Special"> &lt;- </span><span class="Constant">97</span> <span class="Comment"># 'a'</span> <span class="Constant">7</span><span class="Special"> &lt;- </span><span class="Constant">7</span> <span class="Comment"># white</span> <span class="Constant">8</span><span class="Special"> &lt;- </span><span class="Constant">0</span> ] ] <span class="muScenario">scenario</span> print-newline-at-bottom-line [ run [ <span class="Constant">1</span>:address:screen<span class="Special"> &lt;- </span>new-fake-screen <span class="Constant">3/width</span>, <span class="Constant">2/height</span> <span class="Constant">1</span>:address:screen<span class="Special"> &lt;- </span>print-character <span class="Constant">1</span>:address:screen, <span class="Constant">10/newline</span> <span class="Constant">1</span>:address:screen<span class="Special"> &lt;- </span>print-character <span class="Constant">1</span>:address:screen, <span class="Constant">10/newline</span> <span class="Constant">1</span>:address:screen<span class="Special"> &lt;- </span>print-character <span class="Constant">1</span>:address:screen, <span class="Constant">10/newline</span> <span class="Constant">2</span>:number<span class="Special"> &lt;- </span>get *<span class="Constant">1</span>:address:screen, <span class="Constant">cursor-row:offset</span> <span class="Constant">3</span>:number<span class="Special"> &lt;- </span>get *<span class="Constant">1</span>:address:screen, <span class="Constant">cursor-column:offset</span> ] memory-should-contain [ <span class="Constant">2</span><span class="Special"> &lt;- </span><span class="Constant">1</span> <span class="Comment"># cursor row</span> <span class="Constant">3</span><span class="Special"> &lt;- </span><span class="Constant">0</span> <span class="Comment"># cursor column</span> ] ] <span class="muScenario">scenario</span> print-at-bottom-right [ run [ <span class="Constant">1</span>:address:screen<span class="Special"> &lt;- </span>new-fake-screen <span class="Constant">2/width</span>, <span class="Constant">2/height</span> <span class="Constant">1</span>:address:screen<span class="Special"> &lt;- </span>print-character <span class="Constant">1</span>:address:screen, <span class="Constant">10/newline</span> <span class="Constant">1</span>:address:screen<span class="Special"> &lt;- </span>print-character <span class="Constant">1</span>:address:screen, <span class="Constant">97</span> <span class="Comment"># 'a'</span> <span class="Constant">1</span>:address:screen<span class="Special"> &lt;- </span>print-character <span class="Constant">1</span>:address:screen, <span class="Constant">98</span> <span class="Comment"># 'b'</span> <span class="Constant">1</span>:address:screen<span class="Special"> &lt;- </span>print-character <span class="Constant">1</span>:address:screen, <span class="Constant">99</span> <span class="Comment"># 'c'</span> <span class="Constant">1</span>:address:screen<span class="Special"> &lt;- </span>print-character <span class="Constant">1</span>:address:screen, <span class="Constant">10/newline</span> <span class="Constant">1</span>:address:screen<span class="Special"> &lt;- </span>print-character <span class="Constant">1</span>:address:screen, <span class="Constant">100</span> <span class="Comment"># 'd'</span> <span class="Constant">2</span>:number<span class="Special"> &lt;- </span>get *<span class="Constant">1</span>:address:screen, <span class="Constant">cursor-row:offset</span> <span class="Constant">3</span>:number<span class="Special"> &lt;- </span>get *<span class="Constant">1</span>:address:screen, <span class="Constant">cursor-column:offset</span> <span class="Constant">4</span>:address:array:screen-cell<span class="Special"> &lt;- </span>get *<span class="Constant">1</span>:address:screen, <span class="Constant">data:offset</span> <span class="Constant">5</span>:array:screen-cell<span class="Special"> &lt;- </span>copy *<span class="Constant">4</span>:address:array:screen-cell ] memory-should-contain [ <span class="Constant">2</span><span class="Special"> &lt;- </span><span class="Constant">1</span> <span class="Comment"># cursor row</span> <span class="Constant">3</span><span class="Special"> &lt;- </span><span class="Constant">1</span> <span class="Comment"># cursor column</span> <span class="Constant">5</span><span class="Special"> &lt;- </span><span class="Constant">4</span> <span class="Comment"># width*height</span> <span class="Constant">6</span><span class="Special"> &lt;- </span><span class="Constant">0</span> <span class="Comment"># unused</span> <span class="Constant">7</span><span class="Special"> &lt;- </span><span class="Constant">7</span> <span class="Comment"># white</span> <span class="Constant">8</span><span class="Special"> &lt;- </span><span class="Constant">0</span> <span class="Comment"># unused</span> <span class="Constant">9</span><span class="Special"> &lt;- </span><span class="Constant">7</span> <span class="Comment"># white</span> <span class="Constant">10</span><span class="Special"> &lt;- </span><span class="Constant">97</span> <span class="Comment"># 'a'</span> <span class="Constant">11</span><span class="Special"> &lt;- </span><span class="Constant">7</span> <span class="Comment"># white</span> <span class="Constant">12</span><span class="Special"> &lt;- </span><span class="Constant">100</span> <span class="Comment"># 'd' over 'b' and 'c' and newline</span> <span class="Constant">13</span><span class="Special"> &lt;- </span><span class="Constant">7</span> <span class="Comment"># white</span> <span class="Constant">14</span><span class="Special"> &lt;- </span><span class="Constant">0</span> ] ] <span class="muRecipe">recipe</span> clear-line [ <span class="Constant">local-scope</span> sc:address:screen<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span> <span class="Comment"># if x exists, clear line in fake screen</span> <span class="Delimiter">{</span> <span class="muControl">break-unless</span> sc width:number<span class="Special"> &lt;- </span>get *sc, <span class="Constant">num-columns:offset</span> column:address:number<span class="Special"> &lt;- </span>get-address *sc, <span class="Constant">cursor-column:offset</span> original-column:number<span class="Special"> &lt;- </span>copy *column <span class="Comment"># space over the entire line</span> <span class="CommentedCode">#? $start-tracing #? 1</span> <span class="Delimiter">{</span> <span class="CommentedCode">#? $print *column, 10/newline</span> right:number<span class="Special"> &lt;- </span>subtract width, <span class="Constant">1</span> done?:boolean<span class="Special"> &lt;- </span>greater-or-equal *column, right <span class="muControl">break-if</span> done? print-character sc, <span class="Constant">[ ]</span> <span class="Comment"># implicitly updates 'column'</span> <span class="muControl">loop</span> <span class="Delimiter">}</span> <span class="Comment"># now back to where the cursor was</span> *column<span class="Special"> &lt;- </span>copy original-column <span class="muControl">reply</span> sc/same-as-ingredient:<span class="Constant">0</span> <span class="Delimiter">}</span> <span class="Comment"># otherwise, real screen</span> clear-line-on-display <span class="muControl">reply</span> sc/same-as-ingredient:<span class="Constant">0</span> ] <span class="muRecipe">recipe</span> cursor-position [ <span class="Constant">local-scope</span> sc:address:screen<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span> <span class="Comment"># if x exists, lookup cursor in fake screen</span> <span class="Delimiter">{</span> <span class="muControl">break-unless</span> sc row:number<span class="Special"> &lt;- </span>get *sc, <span class="Constant">cursor-row:offset</span> column:number<span class="Special"> &lt;- </span>get *sc, <span class="Constant">cursor-column:offset</span> <span class="muControl">reply</span> row, column, sc/same-as-ingredient:<span class="Constant">0</span> <span class="Delimiter">}</span> row, column<span class="Special"> &lt;- </span>cursor-position-on-display <span class="muControl">reply</span> row, column, sc/same-as-ingredient:<span class="Constant">0</span> ] <span class="muRecipe">recipe</span> move-cursor [ <span class="Constant">local-scope</span> sc:address:screen<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span> new-row:number<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span> new-column:number<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span> <span class="Comment"># if x exists, move cursor in fake screen</span> <span class="Delimiter">{</span> <span class="muControl">break-unless</span> sc row:address:number<span class="Special"> &lt;- </span>get-address *sc, <span class="Constant">cursor-row:offset</span> *row<span class="Special"> &lt;- </span>copy new-row column:address:number<span class="Special"> &lt;- </span>get-address *sc, <span class="Constant">cursor-column:offset</span> *column<span class="Special"> &lt;- </span>copy new-column <span class="muControl">reply</span> sc/same-as-ingredient:<span class="Constant">0</span> <span class="Delimiter">}</span> <span class="Comment"># otherwise, real screen</span> move-cursor-on-display new-row, new-column <span class="muControl">reply</span> sc/same-as-ingredient:<span class="Constant">0</span> ] <span class="muScenario">scenario</span> clear-line-erases-printed-characters [ run [ <span class="CommentedCode">#? $start-tracing #? 4</span> <span class="Constant">1</span>:address:screen<span class="Special"> &lt;- </span>new-fake-screen <span class="Constant">3/width</span>, <span class="Constant">2/height</span> <span class="Comment"># print a character</span> <span class="Constant">1</span>:address:screen<span class="Special"> &lt;- </span>print-character <span class="Constant">1</span>:address:screen, <span class="Constant">97</span> <span class="Comment"># 'a'</span> <span class="Comment"># move cursor to start of line</span> <span class="Constant">1</span>:address:screen<span class="Special"> &lt;- </span>move-cursor <span class="Constant">1</span>:address:screen, <span class="Constant">0/row</span>, <span class="Constant">0/column</span> <span class="Comment"># clear line</span> <span class="Constant">1</span>:address:screen<span class="Special"> &lt;- </span>clear-line <span class="Constant">1</span>:address:screen <span class="Constant">2</span>:address:array:screen-cell<span class="Special"> &lt;- </span>get *<span class="Constant">1</span>:address:screen, <span class="Constant">data:offset</span> <span class="Constant">3</span>:array:screen-cell<span class="Special"> &lt;- </span>copy *<span class="Constant">2</span>:address:array:screen-cell ] <span class="Comment"># screen should be blank</span> memory-should-contain [ <span class="Constant">3</span><span class="Special"> &lt;- </span><span class="Constant">6</span> <span class="Comment"># width*height</span> <span class="Constant">4</span><span class="Special"> &lt;- </span><span class="Constant">0</span> <span class="Constant">5</span><span class="Special"> &lt;- </span><span class="Constant">7</span> <span class="Constant">6</span><span class="Special"> &lt;- </span><span class="Constant">0</span> <span class="Constant">7</span><span class="Special"> &lt;- </span><span class="Constant">7</span> <span class="Constant">8</span><span class="Special"> &lt;- </span><span class="Constant">0</span> <span class="Constant">9</span><span class="Special"> &lt;- </span><span class="Constant">7</span> <span class="Constant">10</span><span class="Special"> &lt;- </span><span class="Constant">0</span> <span class="Constant">11</span><span class="Special"> &lt;- </span><span class="Constant">7</span> <span class="Constant">12</span><span class="Special"> &lt;- </span><span class="Constant">0</span> <span class="Constant">13</span><span class="Special"> &lt;- </span><span class="Constant">7</span> <span class="Constant">14</span><span class="Special"> &lt;- </span><span class="Constant">0</span> <span class="Constant">15</span><span class="Special"> &lt;- </span><span class="Constant">7</span> ] ] <span class="muRecipe">recipe</span> cursor-down [ <span class="Constant">local-scope</span> sc:address:screen<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span> <span class="Comment"># if x exists, move cursor in fake screen</span> <span class="Delimiter">{</span> <span class="muControl">break-unless</span> sc <span class="Delimiter">{</span> <span class="Comment"># increment row unless it's already all the way down</span> height:number<span class="Special"> &lt;- </span>get *sc, <span class="Constant">num-rows:offset</span> row:address:number<span class="Special"> &lt;- </span>get-address *sc, <span class="Constant">cursor-row:offset</span> max:number<span class="Special"> &lt;- </span>subtract height, <span class="Constant">1</span> at-bottom?:boolean<span class="Special"> &lt;- </span>greater-or-equal *row, max <span class="muControl">break-if</span> at-bottom? *row<span class="Special"> &lt;- </span>add *row, <span class="Constant">1</span> <span class="Delimiter">}</span> <span class="muControl">reply</span> sc/same-as-ingredient:<span class="Constant">0</span> <span class="Delimiter">}</span> <span class="Comment"># otherwise, real screen</span> move-cursor-down-on-display <span class="muControl">reply</span> sc/same-as-ingredient:<span class="Constant">0</span> ] <span class="muRecipe">recipe</span> cursor-up [ <span class="Constant">local-scope</span> sc:address:screen<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span> <span class="Comment"># if x exists, move cursor in fake screen</span> <span class="Delimiter">{</span> <span class="muControl">break-unless</span> sc <span class="Delimiter">{</span> <span class="Comment"># decrement row unless it's already all the way up</span> row:address:number<span class="Special"> &lt;- </span>get-address *sc, <span class="Constant">cursor-row:offset</span> at-top?:boolean<span class="Special"> &lt;- </span>lesser-or-equal *row, <span class="Constant">0</span> <span class="muControl">break-if</span> at-top? *row<span class="Special"> &lt;- </span>subtract *row, <span class="Constant">1</span> <span class="Delimiter">}</span> <span class="muControl">reply</span> sc/same-as-ingredient:<span class="Constant">0</span> <span class="Delimiter">}</span> <span class="Comment"># otherwise, real screen</span> move-cursor-up-on-display <span class="muControl">reply</span> sc/same-as-ingredient:<span class="Constant">0</span> ] <span class="muRecipe">recipe</span> cursor-right [ <span class="Constant">local-scope</span> sc:address:screen<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span> <span class="Comment"># if x exists, move cursor in fake screen</span> <span class="Delimiter">{</span> <span class="muControl">break-unless</span> sc <span class="Delimiter">{</span> <span class="Comment"># increment column unless it's already all the way to the right</span> width:number<span class="Special"> &lt;- </span>get *sc, <span class="Constant">num-columns:offset</span> column:address:number<span class="Special"> &lt;- </span>get-address *sc, <span class="Constant">cursor-column:offset</span> max:number<span class="Special"> &lt;- </span>subtract width, <span class="Constant">1</span> at-bottom?:boolean<span class="Special"> &lt;- </span>greater-or-equal *column, max <span class="muControl">break-if</span> at-bottom? *column<span class="Special"> &lt;- </span>add *column, <span class="Constant">1</span> <span class="Delimiter">}</span> <span class="muControl">reply</span> sc/same-as-ingredient:<span class="Constant">0</span> <span class="Delimiter">}</span> <span class="Comment"># otherwise, real screen</span> move-cursor-right-on-display <span class="muControl">reply</span> sc/same-as-ingredient:<span class="Constant">0</span> ] <span class="muRecipe">recipe</span> cursor-left [ <span class="Constant">local-scope</span> sc:address:screen<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span> <span class="Comment"># if x exists, move cursor in fake screen</span> <span class="Delimiter">{</span> <span class="muControl">break-unless</span> sc <span class="Delimiter">{</span> <span class="Comment"># decrement column unless it's already all the way to the left</span> column:address:number<span class="Special"> &lt;- </span>get-address *sc, <span class="Constant">cursor-column:offset</span> at-top?:boolean<span class="Special"> &lt;- </span>lesser-or-equal *column, <span class="Constant">0</span> <span class="muControl">break-if</span> at-top? *column<span class="Special"> &lt;- </span>subtract *column, <span class="Constant">1</span> <span class="Delimiter">}</span> <span class="muControl">reply</span> sc/same-as-ingredient:<span class="Constant">0</span> <span class="Delimiter">}</span> <span class="Comment"># otherwise, real screen</span> move-cursor-left-on-display <span class="muControl">reply</span> sc/same-as-ingredient:<span class="Constant">0</span> ] <span class="muRecipe">recipe</span> cursor-to-start-of-line [ <span class="Constant">local-scope</span> sc:address:screen<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span> row:number, _, sc<span class="Special"> &lt;- </span>cursor-position sc column:number<span class="Special"> &lt;- </span>copy <span class="Constant">0</span> sc<span class="Special"> &lt;- </span>move-cursor sc, row, column <span class="muControl">reply</span> sc/same-as-ingredient:<span class="Constant">0</span> ] <span class="muRecipe">recipe</span> cursor-to-next-line [ <span class="Constant">local-scope</span> screen:address<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span> screen<span class="Special"> &lt;- </span>cursor-down screen screen<span class="Special"> &lt;- </span>cursor-to-start-of-line screen <span class="muControl">reply</span> screen/same-as-ingredient:<span class="Constant">0</span> ] <span class="muRecipe">recipe</span> screen-width [ <span class="Constant">local-scope</span> sc:address:screen<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span> <span class="Comment"># if x exists, move cursor in fake screen</span> <span class="Delimiter">{</span> <span class="muControl">break-unless</span> sc width:number<span class="Special"> &lt;- </span>get *sc, <span class="Constant">num-columns:offset</span> <span class="muControl">reply</span> width <span class="Delimiter">}</span> <span class="Comment"># otherwise, real screen</span> width:number<span class="Special"> &lt;- </span>display-width <span class="muControl">reply</span> width ] <span class="muRecipe">recipe</span> screen-height [ <span class="Constant">local-scope</span> sc:address:screen<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span> <span class="Comment"># if x exists, move cursor in fake screen</span> <span class="Delimiter">{</span> <span class="muControl">break-unless</span> sc height:number<span class="Special"> &lt;- </span>get *sc, <span class="Constant">num-rows:offset</span> <span class="muControl">reply</span> height <span class="Delimiter">}</span> <span class="Comment"># otherwise, real screen</span> height:number<span class="Special"> &lt;- </span>display-height <span class="muControl">reply</span> height ] <span class="muRecipe">recipe</span> hide-cursor [ <span class="Constant">local-scope</span> screen:address<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span> <span class="Comment"># if x exists (not real display), do nothing</span> <span class="Delimiter">{</span> <span class="muControl">break-unless</span> screen <span class="muControl">reply</span> screen <span class="Delimiter">}</span> <span class="Comment"># otherwise, real screen</span> hide-cursor-on-display <span class="muControl">reply</span> screen ] <span class="muRecipe">recipe</span> show-cursor [ <span class="Constant">local-scope</span> screen:address<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span> <span class="Comment"># if x exists (not real display), do nothing</span> <span class="Delimiter">{</span> <span class="muControl">break-unless</span> screen <span class="muControl">reply</span> screen <span class="Delimiter">}</span> <span class="Comment"># otherwise, real screen</span> show-cursor-on-display <span class="muControl">reply</span> screen ] <span class="muRecipe">recipe</span> hide-screen [ <span class="Constant">local-scope</span> screen:address<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span> <span class="Comment"># if x exists (not real display), do nothing</span> <span class="Delimiter">{</span> <span class="muControl">break-unless</span> screen <span class="muControl">reply</span> screen <span class="Delimiter">}</span> <span class="Comment"># otherwise, real screen</span> hide-display <span class="muControl">reply</span> screen ] <span class="muRecipe">recipe</span> show-screen [ <span class="Constant">local-scope</span> screen:address<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span> <span class="Comment"># if x exists (not real display), do nothing</span> <span class="Delimiter">{</span> <span class="muControl">break-unless</span> screen <span class="muControl">reply</span> screen <span class="Delimiter">}</span> <span class="Comment"># otherwise, real screen</span> show-display <span class="muControl">reply</span> screen ] <span class="muRecipe">recipe</span> print-string [ <span class="Constant">local-scope</span> screen:address<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span> s:address:array:character<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span> color:number, color-found?:boolean<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span> <span class="Delimiter">{</span> <span class="Comment"># default color to white</span> <span class="muControl">break-if</span> color-found? color<span class="Special"> &lt;- </span>copy <span class="Constant">7/white</span> <span class="Delimiter">}</span> bg-color:number, bg-color-found?:boolean<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span> <span class="Delimiter">{</span> <span class="Comment"># default bg-color to black</span> <span class="muControl">break-if</span> bg-color-found? bg-color<span class="Special"> &lt;- </span>copy <span class="Constant">0/black</span> <span class="Delimiter">}</span> len:number<span class="Special"> &lt;- </span>length *s i:number<span class="Special"> &lt;- </span>copy <span class="Constant">0</span> <span class="Delimiter">{</span> done?:boolean<span class="Special"> &lt;- </span>greater-or-equal i, len <span class="muControl">break-if</span> done? c:character<span class="Special"> &lt;- </span>index *s, i print-character screen, c, color, bg-color i<span class="Special"> &lt;- </span>add i, <span class="Constant">1</span> <span class="muControl">loop</span> <span class="Delimiter">}</span> <span class="muControl">reply</span> screen/same-as-ingredient:<span class="Constant">0</span> ] <span class="muScenario">scenario</span> print-string-stops-at-right-margin [ run [ <span class="Constant">1</span>:address:screen<span class="Special"> &lt;- </span>new-fake-screen <span class="Constant">3/width</span>, <span class="Constant">2/height</span> <span class="Constant">2</span>:address:array:character<span class="Special"> &lt;- </span>new <span class="Constant">[abcd]</span> <span class="Constant">1</span>:address:screen<span class="Special"> &lt;- </span>print-string <span class="Constant">1</span>:address:screen, <span class="Constant">2</span>:address:array:character <span class="Constant">3</span>:address:array:screen-cell<span class="Special"> &lt;- </span>get *<span class="Constant">1</span>:address:screen, <span class="Constant">data:offset</span> <span class="Constant">4</span>:array:screen-cell<span class="Special"> &lt;- </span>copy *<span class="Constant">3</span>:address:array:screen-cell ] memory-should-contain [ <span class="Constant">4</span><span class="Special"> &lt;- </span><span class="Constant">6</span> <span class="Comment"># width*height</span> <span class="Constant">5</span><span class="Special"> &lt;- </span><span class="Constant">97</span> <span class="Comment"># 'a'</span> <span class="Constant">6</span><span class="Special"> &lt;- </span><span class="Constant">7</span> <span class="Comment"># white</span> <span class="Constant">7</span><span class="Special"> &lt;- </span><span class="Constant">98</span> <span class="Comment"># 'b'</span> <span class="Constant">8</span><span class="Special"> &lt;- </span><span class="Constant">7</span> <span class="Comment"># white</span> <span class="Constant">9</span><span class="Special"> &lt;- </span><span class="Constant">100</span> <span class="Comment"># 'd' overwrites 'c'</span> <span class="Constant">10</span><span class="Special"> &lt;- </span><span class="Constant">7</span> <span class="Comment"># white</span> <span class="Constant">11</span><span class="Special"> &lt;- </span><span class="Constant">0</span> <span class="Comment"># unused</span> ] ] <span class="muRecipe">recipe</span> print-integer [ <span class="Constant">local-scope</span> screen:address<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span> n:number<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span> color:number, color-found?:boolean<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span> <span class="Delimiter">{</span> <span class="Comment"># default color to white</span> <span class="muControl">break-if</span> color-found? color<span class="Special"> &lt;- </span>copy <span class="Constant">7/white</span> <span class="Delimiter">}</span> bg-color:number, bg-color-found?:boolean<span class="Special"> &lt;- </span><span class="Constant">next-ingredient</span> <span class="Delimiter">{</span> <span class="Comment"># default bg-color to black</span> <span class="muControl">break-if</span> bg-color-found? bg-color<span class="Special"> &lt;- </span>copy <span class="Constant">0/black</span> <span class="Delimiter">}</span> <span class="Comment"># todo: other bases besides decimal</span> s:address:array:character<span class="Special"> &lt;- </span>integer-to-decimal-string n print-string screen, s, color, bg-color <span class="muControl">reply</span> screen/same-as-ingredient:<span class="Constant">0</span> ] </pre> </body> </html> <!-- vim: set foldmethod=manual : -->