Add Loop control
[inform-resources.git] / informqr / informqr.md
index eea256baa78e9c8df3aab8b3c611da1b1405a515..c43d0c4e1e58877454b3d45b1302fb1cb31086c2 100644 (file)
@@ -1,4 +1,4 @@
-o% Inform in four minutes
+% Inform in four minutes
 % Roger Firth <roger@firthworks.com>
 
 A quick reference to the Inform programming language.
@@ -302,4 +302,126 @@ A common statement is the assignment:
 There are two forms of multiple assignment:
 
     variable = variable = ... = expr ;
-    variable = expr, variable = expr, ... ;
\ No newline at end of file
+    variable = expr, variable = expr, ... ;
+
+Routines
+--------
+
+A routine can have up to 15 local variables: word values which are
+private to the routine and which by default are set to zero on each
+call. Recursion is permitted.
+
+A **standalone** routine:
+
+-   has a name, by which it is called using `routine();` can also be
+    called indirectly using
+
+    indirect(routine,a1,a2, ... a7)
+
+-   can take arguments, using `routine(a1,a2, ... a7)`, whose values
+    initialise the equivalent local variables
+
+-   returns true at the final "]"
+
+        [ routine
+            local_var local_var ... local_var ;
+            statement;
+            statement;
+            ...
+            statement;
+            ]
+
+A routine **embedded** as the value of an object property:
+
+-   has no name, and is called when the property is invoked; can also
+    be called explicitly using object.property()
+
+-   accepts arguments only when called explicitly
+
+-   returns false at the final "]"
+
+        property [
+            local_var local_var ... local_var;
+            statement;
+            statement;
+            ...
+            statement;
+            ]
+
+Routines return a single value, when execution reaches the final "\]"
+or an explicit return statement:
+
+    return expr;
+    return;
+    rtrue;
+    rfalse;
+
+To define a dummy standalone routine with N local variables (unless it
+already exists):
+
+    Stub routine N;
+
+Flow control
+------------
+
+To execute statements if *expr* is true; optionally, to execute other
+statements if *expr* is false:
+
+    if (expr)
+        statement_block
+    if (expr)
+        statement_block
+    else
+        statement_block
+
+To execute statements depending on the value of *expr*:
+
+    switch (expr) {
+        value: statement; ... statement;
+        value: statement; ... statement;
+        ...
+        default: statement; ... statement;
+        }
+
+where each *value* can be given as:
+
+    constant
+    lo_constant to hi_constant
+    constant,constant, ... constant
+
+Loop control
+------------
+
+To execute statements while *expr* is true:
+
+    while (expr)
+        statement_block
+
+To execute statements until *expr* is true:
+
+    do
+        statement_block
+        until (expr)
+
+To execute statements while a variable changes:
+
+    for (set_var : loop_while_expr : update_var )
+        statement_block
+
+To execute statements for all defined objects:
+
+    objectloop (variable)
+        statement_block
+
+To execute statements for all objects selected by *expr*:
+
+    objectloop (expr_starting_with_variable)
+        statement_block
+
+To jump out of the current innermost loop or switch:
+
+    break;
+
+To immediately start the next iteration of the current loop:
+
+    continue;
\ No newline at end of file