//: Writing to a literal (not computed) address of 0 in a recipe chains two
//: spaces together. When a variable has a property of /space:1, it looks up
//: the variable in the chained/surrounding space. /space:2 looks up the
//: surrounding space of the surrounding space, etc.
:(scenario closure)
def main [
default-space:address:array:location <- new location:type, 30
1:address:array:location/names:new-counter <- new-counter
2:number/raw <- increment-counter 1:address:array:location/names:new-counter
3:number/raw <- increment-counter 1:address:array:location/names:new-counter
]
def new-counter [
default-space:address:array:location <- new location:type, 30
x:number <- copy 23
y:number <- copy 3 # variable that will be incremented
return default-space:address:array:location
]
def increment-counter [
default-space:address:array:location <- new location:type, 30
0:address:array:location/names:new-counter <- next-ingredient # outer space must be created by 'new-counter' above
y:number/space:1 <- add y:number/space:1, 1 # increment
y:number <- copy 234 # dummy
return y:number/space:1
]
+name: lexically surrounding space for recipe increment-counter comes from new-counter
+mem: storing 5 in location 3
//: To make this work, compute the recipe that provides names for the
//: surrounding space of each recipe.
:(before "End Globals")
map<recipe_ordinal, recipe_ordinal> Surrounding_space;
:(before "Transform.push_back(transform_names)")
Transform.push_back(collect_surrounding_spaces); // idempotent
:(code)
void collect_surrounding_spaces(const recipe_ordinal r) {
trace(9991, "transform") << "--- collect surrounding spaces for recipe " << get(Recipe, r).name << end();
//? cerr << "--- collect surrounding spaces for recipe " << get(Recipe, r).name << '\n';
for (int i = 0; i < SIZE(get(Recipe, r).steps); ++i) {
const instruction& inst = get(Recipe, r).steps.at(i);
if (inst.is_label) continue;
for (int j = 0; j < SIZE(inst.products); ++j) {
if (is_literal(inst.products.at(j))) continue;
if (inst.products.at(j).name != "0") continue;
type_tree* type = inst.products.at(j).type;
if (!type
|| type->value != get(Type_ordinal, "address")
|| !type->right
|| type->right->value != get(Type_ordinal, "array")
|| !type->right->right
|| type->right->right->value != get(Type_ordinal, "location")
|| type->right->right->right) {
raise << "slot 0 should always have type address:array:location, but is '" << to_string(inst.products.at(j)) << "'\n" << end();
continue;
}
string_tree* s = property(inst.products.at(j), "names");
if (!s) {
raise << "slot 0 requires a /names property in recipe '" << get(Recipe, r).name << "'\n" << end();
continue;
}
if (s->right) raise << "slot 0 should have a single value in /names, but got '" << to_string(inst.products.at(j)) << "'\n" << end();
const string& surrounding_recipe_name = s->value;
if (surrounding_recipe_name.empty()) {
raise << "slot 0 doesn't initialize its /names property in recipe '" << get(Recipe, r).name << "'\n" << end();
continue;
}
if (contains_key(Surrounding_space, r)
&& get(Surrounding_space, r) != get(Recipe_ordinal, surrounding_recipe_name)) {
raise << "recipe '" << get(Recipe, r).name << "' can have only one 'surrounding' recipe but has '" << get(Recipe, get(Surrounding_space, r)).name << "' and '" << surrounding_recipe_name << "'\n" << end();
continue;
}
trace(9993, "name") << "lexically surrounding space for recipe " << get(Recipe, r).name << " comes from " << surrounding_recipe_name << end();
if (!contains_key(Recipe_ordinal, surrounding_recipe_name)) {
raise << "can't find recipe providing surrounding space for '" << get(Recipe, r).name << "'; looking for '" << surrounding_recipe_name << "'\n" << end();
continue;
}
put(Surrounding_space, r, get(Recipe_ordinal, surrounding_recipe_name));
}
}
}
//: Once surrounding spaces are available, transform_names uses them to handle
//: /space properties.
:(replace{} "int lookup_name(const reagent& r, const recipe_ordinal default_recipe)")
int lookup_name(const reagent& x, const recipe_ordinal default_recipe) {
if (!has_property(x, "space")) {
if (Name[default_recipe].empty()) raise << "name not found: " << x.name << '\n' << end();
return Name[default_recipe][x.name];
}
string_tree* p = property(x, "space");
if (!p || p->right) raise << "/space property should have exactly one (non-negative integer) value\n" << end();
int n = to_integer(p->value);
assert(n >= 0);
recipe_ordinal surrounding_recipe = lookup_surrounding_recipe(default_recipe, n);
if (surrounding_recipe == -1) return -1;
set<recipe_ordinal> done;
vector<recipe_ordinal> path;
return lookup_name(x, surrounding_recipe, done, path);
}
// If the recipe we need to lookup this name in doesn't have names done yet,
// recursively call transform_names on it.
int lookup_name(const reagent& x, const recipe_ordinal r, set<recipe_ordinal>& done, vector<recipe_ordinal>& path) {
if (!Name[r].empty()) return Name[r][x.name];
if (contains_key(done, r)) {
raise << "can't compute address of '" << to_string(x) << "' because\n" << end();
f<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html><head><title>Python: module ranger.fm</title>
</head><body bgcolor="#f0f0f8">
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="heading">
<tr bgcolor="#7799ee">
<td valign=bottom> <br>
<font color="#ffffff" face="helvetica, arial"> <br><big><big><strong><a href="ranger.html"><font color="#ffffff">ranger</font></a>.fm</strong></big></big> (version 1.0.3)</font></td
><td align=right valign=bottom
><font color="#ffffff" face="helvetica, arial"><a href=".">index</a><br><a href="file:/home/hut/ranger/ranger/fm.py">/home/hut/ranger/ranger/fm.py</a></font></td></tr></table>
<p><tt># Copyright (c) 2009, 2010 hut <hut@lavabit.com><br>
#<br>
# Permission to use, copy, modify, and/or distribute this software for any<br>
# purpose with or without fee is hereby granted, provided that the above<br>
# copyright notice and this permission notice appear in all copies.<br>
#<br>
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES<br>
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF<br>
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR<br>
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES<br>
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN<br>
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF<br>
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.</tt></p>
<p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#ee77aa">
<td colspan=3 valign=bottom> <br>
<font color="#ffffff" face="helvetica, arial"><big><strong>Classes</strong></big></font></td></tr>
<tr><td bgcolor="#ee77aa"><tt> </tt></td><td> </td>
<td width="100%"><dl>
<dt><font face="helvetica, arial"><a href="ranger.actions.html#Actions">ranger.actions.Actions</a>(<a href="ranger.shared.html#EnvironmentAware">ranger.shared.EnvironmentAware</a>, <a href="ranger.shared.settings.html#SettingsAware">ranger.shared.settings.SettingsAware</a>)
</font></dt><dd>
<dl>
<dt><font face="helvetica, arial"><a href="ranger.fm.html#FM">FM</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> <br>
<font color="#000000" face="helvetica, arial"><a name="FM">class <strong>FM</strong></a>(<a href="ranger.actions.html#Actions">ranger.actions.Actions</a>)</font></td></tr>
<tr><td bgcolor="#ffc8d8"><tt> </tt></td><td> </td>
<td width="100%"><dl><dt>Method resolution order:</dt>
<dd><a href="ranger.fm.html#FM">FM</a></dd>
<dd><a href="ranger.actions.html#Actions">ranger.actions.Actions</a></dd>
<dd><a href="ranger.shared.html#EnvironmentAware">ranger.shared.EnvironmentAware</a></dd>
<dd><a href="ranger.shared.html#Awareness">ranger.shared.Awareness</a></dd>
<dd><a href="ranger.shared.settings.html#SettingsAware">ranger.shared.settings.SettingsAware</a></dd>
<dd><a href="__builtin__.html#object">__builtin__.object</a></dd>
</dl>
<hr>
Methods defined here:<br>
<dl><dt><a name="FM-__init__"><strong>__init__</strong></a>(self, ui<font color="#909090">=None</font>, bookmarks<font color="#909090">=None</font>, tags<font color="#909090">=None</font>)</dt><dd><tt>Initialize <a href="#FM">FM</a>.</tt></dd></dl>
<dl><dt><a name="FM-block_input"><strong>block_input</strong></a>(self, sec<font color="#909090">=0</font>)</dt></dl>
<dl><dt><a name="FM-initialize"><strong>initialize</strong></a>(self)</dt><dd><tt>If ui/bookmarks are None, they will be initialized here.</tt></dd></dl>
<dl><dt><a name="FM-loop"><strong>loop</strong></a>(self)</dt><dd><tt>The main loop consists of:<br>
1. reloading bookmarks if outdated<br>
2. letting the loader work<br>
3. drawing and finalizing ui<br>
4. reading and handling user input<br>
5. after X loops: collecting unused directory objects</tt></dd></dl>
<hr>
Data descriptors defined here:<br>
<dl><dt><strong>executables</strong></dt>
</dl>
<hr>
Data and other attributes defined here:<br>
<dl><dt><strong>input_blocked</strong> = False</dl>
<dl><dt><strong>input_blocked_until</strong> = 0</dl>
<dl><dt><strong>stderr_to_out</strong> = False</dl>
<hr>
Methods inherited from <a href="ranger.actions.html#Actions">ranger.actions.Actions</a>:<br>
<dl><dt><a name="FM-cd"><strong>cd</strong></a>(self, path, remember<font color="#909090">=True</font>)</dt><dd><tt>enter the directory at the given path, remember=True</tt></dd></dl>
<dl><dt><a name="FM-copy"><strong>copy</strong></a>(self)</dt><dd><tt>Copy the selected items</tt></dd></dl>
<dl><dt><a name="FM-cut"><strong>cut</strong></a>(self)</dt></dl>
<dl><dt><a name="FM-delete"><strong>delete</strong></a>(self)</dt></dl>
<dl><dt><a name="FM-display_command_help"><strong>display_command_help</strong></a>(self, console_widget)</dt></dl>
<dl><dt><a name="FM-display_file"><strong>display_file</strong></a>(self)</dt></dl>
<dl><dt><a name="FM-display_help"><strong>display_help</strong></a>(self, topic<font color="#909090">='index'</font>, narg<font color="#909090">=None</font>)</dt></dl>
<dl><dt><a name="FM-display_log"><strong>display_log</strong></a>(self)</dt></dl>
<dl><dt><a name="FM-edit_file"><strong>edit_file</strong></a>(self, file<font color="#909090">=None</font>)</dt><dd><tt>Calls execute_file with the current file and app='editor'</tt></dd></dl>
<dl><dt><a name="FM-enter_bookmark"><strong>enter_bookmark</strong></a>(self, key)</dt><dd><tt>Enter the bookmark with the name <key></tt></dd></dl>
<dl><dt><a name="FM-enter_dir"><strong>enter_dir</strong></a>(self, path, remember<font color="#909090">=False</font>)</dt><dd><tt>Enter the directory at the given path</tt></dd></dl>
<dl><dt><a name="FM-execute_command"><strong>execute_command</strong></a>(self, cmd, **kw)</dt></dl>
<dl><dt><a name="FM-execute_file"><strong>execute_file</strong></a>(self, files, **kw)</dt><dd><tt>Execute a file.<br>
app is the name of a method in Applications, without the "app_"<br>
flags is a string consisting of runner.ALLOWED_FLAGS<br>
mode is a positive integer.<br>
Both flags and mode specify how the program is run.</tt></dd></dl>
<dl><dt><a name="FM-exit"><strong>exit</strong></a>(self)</dt><dd><tt>Exit the program</tt></dd></dl>
<dl><dt><a name="FM-force_load_preview"><strong>force_load_preview</strong></a>(self)</dt></dl>
<dl><dt><a name="FM-handle_mouse"><strong>handle_mouse</strong></a>(self)</dt><dd><tt>Handle mouse-buttons if one was pressed</tt></dd></dl>
<dl><dt><a name="FM-history_go"><strong>history_go</strong></a>(self, relative)</dt><dd><tt>Move back and forth in the history</tt></dd></dl>
<dl><dt><a name="FM-mark"><strong>mark</strong></a>(self, all<font color="#909090">=False</font>, toggle<font color="#909090">=False</font>, val<font color="#909090">=None</font>, movedown<font color="#909090">=None</font>, narg<font color="#909090">=1</font>)</dt><dd><tt>A wrapper for the directory.mark_xyz functions.<br>
<br>
Arguments:<br>
all - change all files of the current directory at once?<br>
toggle - toggle the marked-status?<br>
val - mark or unmark?</tt></dd></dl>
<dl><dt><a name="FM-mkdir"><strong>mkdir</strong></a>(self, name)</dt></dl>
<dl><dt><a name="FM-move_left"><strong>move_left</strong></a>(self, narg<font color="#909090">=1</font>)</dt><dd><tt>Enter the parent directory</tt></dd></dl>
<dl><dt><a name="FM-move_pointer"><strong>move_pointer</strong></a>(self, relative<font color="#909090">=0</font>, absolute<font color="#909090">=None</font>, narg<font color="#909090">=None</font>)</dt><dd><tt>Move the pointer down by <relative> or to <absolute></tt></dd></dl>
<dl><dt><a name="FM-move_pointer_by_pages"><strong>move_pointer_by_pages</strong></a>(self, relative)</dt><dd><tt>Move the pointer down by <relative> pages</tt></dd></dl>
<dl><dt><a name="FM-move_pointer_by_percentage"><strong>move_pointer_by_percentage</strong></a>(self, relative<font color="#909090">=0</font>, absolute<font color="#909090">=None</font>, narg<font color="#909090">=None</font>)</dt><dd><tt>Move the pointer down by <relative>% or to <absolute>%</tt></dd></dl>
<dl><dt><a name="FM-move_right"><strong>move_right</strong></a>(self, mode<font color="#909090">=0</font>, narg<font color="#909090">=None</font>)</dt><dd><tt>Enter the current directory or execute the current file</tt></dd></dl>
<dl><dt><a name="FM-notify"><strong>notify</strong></a>(self, text, duration<font color="#909090">=4</font>, bad<font color="#909090">=False</font>)</dt></dl>
<dl><dt><a name="FM-open_console"><strong>open_console</strong></a>(self, mode<font color="#909090">=':'</font>, string<font color="#909090">=''</font>)</dt><dd><tt>Open the console if the current UI supports that</tt></dd></dl>
<dl><dt><a name="FM-paste"><strong>paste</strong></a>(self, overwrite<font color="#909090">=False</font>)</dt><dd><tt>Paste the selected items into the current directory</tt></dd></dl>
<dl><dt><a name="FM-paste_symlink"><strong>paste_symlink</strong></a>(self)</dt></dl>
<dl><dt><a name="FM-redraw_window"><strong>redraw_window</strong></a>(self)</dt><dd><tt>Redraw the window</tt></dd></dl>
<dl><dt><a name="FM-reload_cwd"><strong>reload_cwd</strong></a>(self)</dt></dl>
<dl><dt><a name="FM-rename"><strong>rename</strong></a>(self, src, dest)</dt></dl>
<dl><dt><a name="FM-reset"><strong>reset</strong></a>(self)</dt><dd><tt>Reset the filemanager, clearing the directory buffer</tt></dd></dl>
<dl><dt><a name="FM-resize"><strong>resize</strong></a>(self)</dt><dd><tt>Update the size of the UI</tt></dd></dl>
<dl><dt><a name="FM-scroll"><strong>scroll</strong></a>(self, relative)</dt><dd><tt>Scroll down by <relative> lines</tt></dd></dl>
<dl><dt><a name="FM-search"><strong>search</strong></a>(self, order<font color="#909090">=None</font>, forward<font color="#909090">=True</font>)</dt></dl>
<dl><dt><a name="FM-set_bookmark"><strong>set_bookmark</strong></a>(self, key)</dt><dd><tt>Set the bookmark with the name <key> to the current directory</tt></dd></dl>
<dl><dt><a name="FM-set_filter"><strong>set_filter</strong></a>(self, fltr)</dt></dl>
<dl><dt><a name="FM-set_search_method"><strong>set_search_method</strong></a>(self, order, forward<font color="#909090">=True</font>)</dt></dl>
<dl><dt><a name="FM-sort"><strong>sort</strong></a>(self, func<font color="#909090">=None</font>, reverse<font color="#909090">=None</font>)</dt></dl>
<dl><dt><a name="FM-tag_remove"><strong>tag_remove</strong></a>(self, movedown<font color="#909090">=None</font>)</dt></dl>
<dl><dt><a name="FM-tag_toggle"><strong>tag_toggle</strong></a>(self, movedown<font color="#909090">=None</font>)</dt></dl>
<dl><dt><a name="FM-toggle_boolean_option"><strong>toggle_boolean_option</strong></a>(self, string)</dt><dd><tt>Toggle a boolean option named <string></tt></dd></dl>
<dl><dt><a name="FM-unset_bookmark"><strong>unset_bookmark</strong></a>(self, key)</dt><dd><tt>Delete the bookmark with the name <key></tt></dd></dl>
<hr>
Data and other attributes inherited from <a href="ranger.actions.html#Actions">ranger.actions.Actions</a>:<br>
<dl><dt><strong>search_forward</strong> = False</dl>
<dl><dt><strong>search_method</strong> = 'ctime'</dl>
<hr>
Data and other attributes inherited from <a href="ranger.shared.html#EnvironmentAware">ranger.shared.EnvironmentAware</a>:<br>
<dl><dt><strong>env</strong> = None</dl>
<hr>
Data descriptors inherited from <a href="ranger.shared.html#Awareness">ranger.shared.Awareness</a>:<br>
<dl><dt><strong>__dict__</strong></dt>
<dd><tt>dictionary for instance variables (if defined)</tt></dd>
</dl>
<dl><dt><strong>__weakref__</strong></dt>
<dd><tt>list of weak references to the object (if defined)</tt></dd>
</dl>
<hr>
Data and other attributes inherited from <a href="ranger.shared.settings.html#SettingsAware">ranger.shared.settings.SettingsAware</a>:<br>
<dl><dt><strong>settings</strong> = <ranger.ext.openstruct.OpenStruct object at 0xe2f090></dl>
</td></tr></table></td></tr></table><p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#eeaa77">
<td colspan=3 valign=bottom> <br>
<font color="#ffffff" face="helvetica, arial"><big><strong>Functions</strong></big></font></td></tr>
<tr><td bgcolor="#eeaa77"><tt> </tt></td><td> </td>
<td width="100%"><dl><dt><a name="-time"><strong>time</strong></a>(...)</dt><dd><tt><a href="#-time">time</a>() -> floating point number<br>
<br>
Return the current time in seconds since the Epoch.<br>
Fractions of a second may be present if the system clock provides them.</tt></dd></dl>
</td></tr></table><p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#55aa55">
<td colspan=3 valign=bottom> <br>
<font color="#ffffff" face="helvetica, arial"><big><strong>Data</strong></big></font></td></tr>
<tr><td bgcolor="#55aa55"><tt> </tt></td><td> </td>
<td width="100%"><strong>CTRL_C</strong> = 3<br>
<strong>TICKS_BEFORE_COLLECTING_GARBAGE</strong> = 100<br>
<strong>__version__</strong> = '1.0.3'</td></tr></table>
</body></html>