annotate website/src/manual.html.luan @ 1702:8ad468cc88d4

add goodjava/bbcode
author Franklin Schmidt <fschmidt@gmail.com>
date Thu, 30 Jun 2022 20:04:34 -0600
parents 9ef19f5ea973
children 19df8abc9805
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1656
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1 local Luan = require "luan:Luan.luan"
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
2 local error = Luan.error
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3 local Io = require "luan:Io.luan"
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
4 local Http = require "luan:http/Http.luan"
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
5 local Shared = require "site:/lib/Shared.luan"
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
6 local head = Shared.head or error()
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
7 local docs_header = Shared.docs_header or error()
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
8 local show_toc = Shared.show_toc or error()
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
9 local show_content = Shared.show_content or error()
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
10
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
11
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
12 local content = {
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
13 intro = {
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
14 title = "Introduction"
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
15 content = function()
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
16 %>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
17 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
18 Luan is a high level programming language based on <a href="http://www.lua.org">Lua</a>. A great strength of Lua is its simplicity and Luan takes this even further, being even simpler than Lua. The goal is to provide a simple programming language for the casual programmer with as few concepts as possible so that one can quickly learn the language and then easily understand any code written in Luan.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
19 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
20
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
21 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
22 Luan is implemented in Java and is tightly coupled with Java. So it makes a great scripting language for Java programmers.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
23 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
24
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
25 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
26 Unlike Lua which is meant to be embedded, Luan is meant to be a full scripting language. This done not by adding features to Luan, but rather by providing a complete set of libraries.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
27 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
28 <%
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
29 end
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
30 }
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
31 basic = {
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
32 title = "Basic Concepts"
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
33 content = function()
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
34 %>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
35 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
36 This section describes the basic concepts of the language.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
37 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
38 <%
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
39 end
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
40 subs = {
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
41 types = {
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
42 title = "Values and Types"
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
43 content = function()
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
44 %>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
45 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
46 Luan is a <em>dynamically typed language</em>.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
47 This means that
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
48 variables do not have types; only values do.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
49 There are no type definitions in the language.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
50 All values carry their own type.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
51 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
52
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
53 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
54 All values in Luan are <em>first-class values</em>.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
55 This means that all values can be stored in variables,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
56 passed as arguments to other functions, and returned as results.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
57 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
58
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
59 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
60 There are eight basic types in Luan:
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
61 <em>nil</em>, <em>boolean</em>, <em>number</em>,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
62 <em>string</em>, <em>binary</em>, <em>function</em>, <em>java</em>,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
63 and <em>table</em>.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
64 <em>Nil</em> is the type of the value <b>nil</b>,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
65 whose main property is to be different from any other value;
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
66 it usually represents the absence of a useful value.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
67 <em>Nil</em> is implemented as the Java value <em>null</em>.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
68 <em>Boolean</em> is the type of the values <b>false</b> and <b>true</b>.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
69 <em>Boolean</em> is implemented as the Java class <em>Boolean</em>.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
70 <em>Number</em> represents both
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
71 integer numbers and real (floating-point) numbers.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
72 <em>Number</em> is implemented as the Java class <em>Number</em>. Any Java subclass of <em>Number</em> is allowed and this is invisible to the Luan user. Operations on numbers follow the same rules of
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
73 the underlying Java implementation.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
74 <em>String</em> is implemented as the Java class <em>String</em>.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
75 <em>Binary</em> is implemented as the Java type <em>byte[]</em>.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
76 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
77
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
78 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
79 Luan can call (and manipulate) functions written in Luan and
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
80 functions written in Java (see <a href="#fn_calls">Function Calls</a>).
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
81 Both are represented by the type <em>function</em>.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
82 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
83
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
84 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
85 The type <em>java</em> is provided to allow arbitrary Java objects to
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
86 be stored in Luan variables.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
87 A <em>java</em> value is a Java object that isn't one of the standard Luan types.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
88 Java values have no predefined operations in Luan,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
89 except assignment and identity test.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
90 Java values are useful when Java access is enabled in Luan.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
91 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
92
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
93 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
94 The type <em>table</em> implements associative arrays,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
95 that is, arrays that can be indexed not only with numbers,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
96 but with any Luan value except <b>nil</b>.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
97 Tables can be <em>heterogeneous</em>;
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
98 that is, they can contain values of all types (except <b>nil</b>).
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
99 Any key with value <b>nil</b> is not considered part of the table.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
100 Conversely, any key that is not part of a table has
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
101 an associated value <b>nil</b>.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
102 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
103
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
104 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
105 Tables are the sole data-structuring mechanism in Luan;
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
106 they can be used to represent ordinary arrays, sequences,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
107 symbol tables, sets, records, graphs, trees, etc.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
108 To represent records, Luan uses the field name as an index.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
109 The language supports this representation by
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
110 providing <code>a.name</code> as syntactic sugar for <code>a["name"]</code>.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
111 There are several convenient ways to create tables in Luan
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
112 (see <a href="#constructors">Table Constructors</a>).
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
113 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
114
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
115 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
116 We use the term <em>sequence</em> to denote a table where
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
117 the set of all positive numeric keys is equal to {1..<em>n</em>}
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
118 for some non-negative integer <em>n</em>,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
119 which is called the length of the sequence (see <a href="#length">The Length Operator</a>).
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
120 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
121
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
122 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
123 Like indices,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
124 the values of table fields can be of any type.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
125 In particular,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
126 because functions are first-class values,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
127 table fields can contain functions.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
128 Thus tables can also carry <em>methods</em> (see <a href="#fn_def">Function Definitions</a>).
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
129 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
130
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
131 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
132 The indexing of tables follows
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
133 the definition of raw equality in the language.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
134 The expressions <code>a[i]</code> and <code>a[j]</code>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
135 denote the same table element
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
136 if and only if <code>i</code> and <code>j</code> are raw equal
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
137 (that is, equal without metamethods).
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
138 In particular, floats with integral values
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
139 are equal to their respective integers
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
140 (e.g., <code>1.0 == 1</code>).
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
141 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
142
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
143 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
144 Luan values are <em>objects</em>:
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
145 variables do not actually <em>contain</em> values,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
146 only <em>references</em> to them.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
147 Assignment, parameter passing, and function returns
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
148 always manipulate references to values;
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
149 these operations do not imply any kind of copy.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
150 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
151
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
152 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
153 The library function <a href="#Luan.type"><code>Luan.type</code></a> returns a string describing the type
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
154 of a given value.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
155 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
156 <%
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
157 end
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
158 }
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
159 env = {
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
160 title = "Environments"
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
161 content = function()
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
162 %>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
163 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
164 The environment of a chunk starts with only one local variable: <code><a href="#require">require</a></code>. This function is used to load and access libraries and other modules. All other variables must be added to the environment using <a href="http://localhost:8080/manual.html#local_stmt">local declarations</a>.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
165 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
166
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
167 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
168 As will be discussed in <a href="#vars">Variables</a> and <a href=#assignment">Assignment</a>,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
169 any reference to a free name
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
170 (that is, a name not bound to any declaration) <code>var</code>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
171 can be syntactically translated to <code>_ENV.var</code> if <code>_ENV</code> is defined.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
172 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
173 <%
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
174 end
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
175 }
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
176 error = {
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
177 title = "Error Handling"
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
178 content = function()
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
179 %>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
180 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
181 Luan code can explicitly generate an error by calling the
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
182 <a href="#Luan.error"><code>error</code></a> function.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
183 If you need to catch errors in Luan,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
184 you can use the <a href="#try">Try Statement</code></a>.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
185 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
186
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
187 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
188 Whenever there is an error,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
189 an <em>error table</em>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
190 is propagated with information about the error.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
191 See <a href="#Luan.new_error"><code>Luan.new_error</code></a>.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
192 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
193 <%
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
194 end
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
195 }
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
196 meta = {
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
197 title = "Metatables and Metamethods"
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
198 content = function()
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
199 %>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
200 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
201 Every table in Luan can have a <em>metatable</em>.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
202 This <em>metatable</em> is an ordinary Luan table
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
203 that defines the behavior of the original value
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
204 under certain special operations.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
205 You can change several aspects of the behavior
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
206 of operations over a value by setting specific fields in its metatable.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
207 For instance, when a table is the operand of an addition,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
208 Luan checks for a function in the field "<code>__add</code>" of the table's metatable.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
209 If it finds one,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
210 Luan calls this function to perform the addition.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
211 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
212
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
213 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
214 The keys in a metatable are derived from the <em>event</em> names;
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
215 the corresponding values are called <ii>metamethods</em>.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
216 In the previous example, the event is <code>"add"</code>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
217 and the metamethod is the function that performs the addition.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
218 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
219
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
220 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
221 You can query the metatable of any table
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
222 using the <a href="#Luan.get_metatable"><code>get_metatable</code></a> function.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
223 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
224
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
225 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
226 You can replace the metatable of tables
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
227 using the <a href="#Luan.set_metatable"><code>set_metatable</code></a> function.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
228 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
229
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
230 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
231 A metatable controls how a table behaves in
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
232 arithmetic operations, bitwise operations,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
233 order comparisons, concatenation, length operation, calls, and indexing.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
234 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
235
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
236 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
237 A detailed list of events controlled by metatables is given next.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
238 Each operation is identified by its corresponding event name.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
239 The key for each event is a string with its name prefixed by
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
240 two underscores, '<code>__</code>';
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
241 for instance, the key for operation "add" is the
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
242 string "<code>__add</code>".
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
243 Note that queries for metamethods are always raw;
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
244 the access to a metamethod does not invoke other metamethods.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
245 You can emulate how Luan queries a metamethod for an object <code>obj</code>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
246 with the following code:
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
247 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
248
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
249 <pre>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
250 raw_get(get_metatable(obj) or {}, "__" .. event_name)
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
251 </pre>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
252
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
253 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
254 Here are the events:
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
255 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
256
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
257 <ul>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
258
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
259 <li><p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
260 <b>"add": </b>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
261 the <code>+</code> operation.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
262
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
263 If any operand for an addition is a table,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
264 Luan will try to call a metamethod.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
265 First, Luan will check the first operand (even if it is valid).
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
266 If that operand does not define a metamethod for the "<code>__add</code>" event,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
267 then Luan will check the second operand.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
268 If Luan can find a metamethod,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
269 it calls the metamethod with the two operands as arguments,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
270 and the result of the call
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
271 (adjusted to one value)
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
272 is the result of the operation.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
273 Otherwise,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
274 it raises an error.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
275 </p></li>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
276
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
277 <li><p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
278 <b>"sub": </b>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
279 the <code>-</code> operation.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
280 Behavior similar to the "add" operation.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
281 </li>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
282
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
283 <li><p><b>"mul": </b>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
284 the <code>*</code> operation.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
285 Behavior similar to the "add" operation.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
286 </p></li>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
287
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
288 <li><p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
289 <b>"div": </b>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
290 the <code>/</code> operation.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
291 Behavior similar to the "add" operation.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
292 </p></li>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
293
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
294 <li><p>
1680
9ef19f5ea973 add // operator
Franklin Schmidt <fschmidt@gmail.com>
parents: 1670
diff changeset
295 <b>"idiv": </b>
9ef19f5ea973 add // operator
Franklin Schmidt <fschmidt@gmail.com>
parents: 1670
diff changeset
296 the <code>//</code> operation.
9ef19f5ea973 add // operator
Franklin Schmidt <fschmidt@gmail.com>
parents: 1670
diff changeset
297 Behavior similar to the "add" operation.
9ef19f5ea973 add // operator
Franklin Schmidt <fschmidt@gmail.com>
parents: 1670
diff changeset
298 </p></li>
9ef19f5ea973 add // operator
Franklin Schmidt <fschmidt@gmail.com>
parents: 1670
diff changeset
299
9ef19f5ea973 add // operator
Franklin Schmidt <fschmidt@gmail.com>
parents: 1670
diff changeset
300 <li><p>
1656
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
301 <b>"mod": </b>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
302 the <code>%</code> operation.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
303 Behavior similar to the "add" operation.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
304 </p></li>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
305
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
306 <li><p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
307 <b>"pow": </b>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
308 the <code>^</code> (exponentiation) operation.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
309 Behavior similar to the "add" operation.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
310 </p></li>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
311
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
312 <li><p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
313 <b>"unm": </b>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
314 the <code>-</code> (unary minus) operation.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
315 Behavior similar to the "add" operation.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
316 </p></li>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
317
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
318 <li><p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
319 <b>"concat": </b>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
320 the <code>..</code> (concatenation) operation.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
321 Behavior similar to the "add" operation.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
322 </p></li>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
323
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
324 <li><p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
325 <b>"len": </b>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
326 the <code>#</code> (length) operation.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
327 If there is a metamethod,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
328 Luan calls it with the object as argument,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
329 and the result of the call
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
330 (always adjusted to one value)
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
331 is the result of the operation.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
332 If there is no metamethod but the object is a table,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
333 then Luan uses the table length operation (see <a href="#length">The Length Operator</a>).
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
334 Otherwise, Luan raises an error.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
335 </p></li>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
336
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
337 <li><p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
338 <b>"eq": </b>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
339 the <code>==</code> (equal) operation.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
340 Behavior similar to the "add" operation,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
341 except that Luan will try a metamethod only when the values
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
342 being compared are both tables
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
343 and they are not primitively equal.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
344 The result of the call is always converted to a boolean.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
345 </p></li>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
346
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
347 <li><p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
348 <b>"lt": </b>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
349 the <code>&lt;</code> (less than) operation.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
350 Behavior similar to the "add" operation.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
351 The result of the call is always converted to a boolean.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
352 </p></li>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
353
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
354 <li><p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
355 <b>"le": </b>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
356 the <code>&lt;=</code> (less equal) operation.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
357 Unlike other operations,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
358 The less-equal operation can use two different events.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
359 First, Luan looks for the "<code>__le</code>" metamethod in both operands,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
360 like in the "lt" operation.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
361 If it cannot find such a metamethod,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
362 then it will try the "<code>__lt</code>" event,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
363 assuming that <code>a &lt;= b</code> is equivalent to <code>not (b &lt; a)</code>.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
364 As with the other comparison operators,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
365 the result is always a boolean.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
366 </p></li>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
367
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
368 <li>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
369 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
370 <b>"index": </b>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
371 The indexing access <code>table[key]</code>.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
372 This event happens
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
373 when <code>key</code> is not present in <code>table</code>.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
374 The metamethod is looked up in <code>table</code>.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
375 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
376
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
377 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
378 Despite the name,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
379 the metamethod for this event can be any type.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
380 If it is a function,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
381 it is called with <code>table</code> and <code>key</code> as arguments.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
382 Otherwise
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
383 the final result is the result of indexing this metamethod object with <code>key</code>.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
384 (This indexing is regular, not raw,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
385 and therefore can trigger another metamethod if the metamethod object is a table.)
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
386 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
387 </li>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
388
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
389 <li>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
390 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
391 <b>"new_index": </b>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
392 The indexing assignment <code>table[key] = value</code>.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
393 Like the index event,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
394 this event happens when
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
395 when <code>key</code> is not present in <code>table</code>.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
396 The metamethod is looked up in <code>table</code>.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
397 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
398
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
399 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
400 Like with indexing,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
401 the metamethod for this event can be either a function or a table.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
402 If it is a function,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
403 it is called with <code>table</code>, <code>key</code>, and <code>value</code> as arguments.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
404 If it is a table,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
405 Luan does an indexing assignment to this table with the same key and value.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
406 (This assignment is regular, not raw,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
407 and therefore can trigger another metamethod.)
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
408 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
409
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
410 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
411 Whenever there is a "new_index" metamethod,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
412 Luan does not perform the primitive assignment.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
413 (If necessary,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
414 the metamethod itself can call <a href="#Luan.raw_set"><code>raw_set</code></a>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
415 to do the assignment.)
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
416 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
417 </li>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
418
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
419 <li><p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
420 <b>"gc":</b>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
421 This is when a table is garbage collected. When the table's <a href="https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#finalize()">finalize</a> method is called by the Java garbage collector, if there is a "<code>__gc</code>" metamethod then it is called with the table as a parameter.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
422 </p></li>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
423
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
424 </ul>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
425 <%
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
426 end
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
427 }
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
428 gc = {
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
429 title = "Garbage Collection"
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
430 content = function()
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
431 %>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
432 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
433 Luan uses Java's garbage collection.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
434 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
435 <%
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
436 end
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
437 }
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
438 }
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
439 }
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
440 lang = {
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
441 title = "The Language"
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
442 content = function()
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
443 %>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
444 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
445 This section describes the lexis, the syntax, and the semantics of Luan.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
446 In other words,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
447 this section describes
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
448 which tokens are valid,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
449 how they can be combined,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
450 and what their combinations mean.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
451 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
452
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
453 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
454 Language constructs will be explained using the usual extended BNF notation,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
455 in which
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
456 {<em>a</em>}&nbsp;means&nbsp;0 or more <em>a</em>'s, and
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
457 [<em>a</em>]&nbsp;means an optional <em>a</em>.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
458 Non-terminals are shown like non-terminal,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
459 keywords are shown like <b>kword</b>,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
460 and other terminal symbols are shown like &lsquo;<b>=</b>&rsquo;.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
461 The complete syntax of Luan can be found in <a href="#9">&sect;9</a>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
462 at the end of this manual.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
463 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
464 <%
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
465 end
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
466 subs = {
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
467 lex = {
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
468 title = "Lexical Conventions"
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
469 content = function()
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
470 %>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
471 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
472 Luan ignores spaces and comments
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
473 between lexical elements (tokens),
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
474 except as delimiters between names and keywords.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
475 Luan considers the end of a line to be the end of a statement. This catches errors and encourages readability. If you want to continue a statement on another line, you can use a backslash followed by a newline which will be treated as white space.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
476 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
477
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
478 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
479 <em>Names</em>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
480 (also called <em>identifiers</em>)
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
481 in Luan can be any string of letters,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
482 digits, and underscores,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
483 not beginning with a digit.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
484 Identifiers are used to name variables, table fields, and labels.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
485 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
486
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
487 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
488 The following <em>keywords</em> are reserved
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
489 and cannot be used as names:
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
490 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
491
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
492 <p keywords>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
493 <span>and</span>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
494 <span>break</span>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
495 <span>catch</span>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
496 <span>continue</span>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
497 <span>do</span>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
498 <span>else</span>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
499 <span>elseif</span>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
500 <span>end_do</span>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
501 <span>end_for</span>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
502 <span>end_function</span>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
503 <span>end_if</span>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
504 <span>end_try</span>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
505 <span>end_while</span>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
506 <span>false</span>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
507 <span>finally</span>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
508 <span>for</span>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
509 <span>function</span>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
510 <span>if</span>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
511 <span>in</span>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
512 <span>local</span>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
513 <span>nil</span>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
514 <span>not</span>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
515 <span>or</span>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
516 <span>repeat</span>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
517 <span>return</span>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
518 <span>then</span>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
519 <span>true</span>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
520 <span>try</span>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
521 <span>until</span>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
522 <span>while</span>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
523 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
524
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
525 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
526 Luan is a case-sensitive language:
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
527 <code>and</code> is a reserved word, but <code>And</code> and <code>AND</code>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
528 are two different, valid names.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
529 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
530
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
531 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
532 The following strings denote other tokens:
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
533 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
534
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
535 <pre>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
536 + - * / % ^ #
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
537 &amp; ~ | &lt;&lt; &gt;&gt; //
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
538 == ~= &lt;= &gt;= &lt; &gt; =
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
539 ( ) { } [ ] ::
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
540 ; : , . .. ...
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
541 </pre>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
542
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
543 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
544 <em>Literal strings</em>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
545 can be delimited by matching single or double quotes,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
546 and can contain the following C-like escape sequences:
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
547 '<code>\a</code>' (bell),
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
548 '<code>\b</code>' (backspace),
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
549 '<code>\f</code>' (form feed),
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
550 '<code>\n</code>' (newline),
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
551 '<code>\r</code>' (carriage return),
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
552 '<code>\t</code>' (horizontal tab),
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
553 '<code>\v</code>' (vertical tab),
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
554 '<code>\\</code>' (backslash),
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
555 '<code>\"</code>' (quotation mark [double quote]),
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
556 and '<code>\'</code>' (apostrophe [single quote]).
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
557 A backslash followed by a real newline
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
558 results in a newline in the string.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
559 The escape sequence '<code>\z</code>' skips the following span
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
560 of white-space characters,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
561 including line breaks;
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
562 it is particularly useful to break and indent a long literal string
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
563 into multiple lines without adding the newlines and spaces
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
564 into the string contents.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
565 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
566
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
567 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
568 Luan can specify any character in a literal string by its numerical value.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
569 This can be done
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
570 with the escape sequence <code>\x<em>XX</em></code>,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
571 where <em>XX</em> is a sequence of exactly two hexadecimal digits,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
572 or with the escape sequence <code>\u<em>XXXX</em></code>,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
573 where <em>XXXX</em> is a sequence of exactly four hexadecimal digits,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
574 or with the escape sequence <code>\<em>ddd</em></code>,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
575 where <em>ddd</em> is a sequence of up to three decimal digits.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
576 (Note that if a decimal escape sequence is to be followed by a digit,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
577 it must be expressed using exactly three digits.)
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
578 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
579
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
580 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
581 Literal strings can also be defined using a long format
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
582 enclosed by <em>long brackets</em>.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
583 We define an <em>opening long bracket of level <em>n</em></em> as an opening
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
584 square bracket followed by <em>n</em> equal signs followed by another
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
585 opening square bracket.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
586 So, an opening long bracket of level 0 is written as <code>[[</code>,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
587 an opening long bracket of level 1 is written as <code>[=[</code>,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
588 and so on.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
589 A <em>closing long bracket</em> is defined similarly;
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
590 for instance,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
591 a closing long bracket of level 4 is written as <code>]====]</code>.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
592 A <em>long literal</em> starts with an opening long bracket of any level and
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
593 ends at the first closing long bracket of the same level.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
594 It can contain any text except a closing bracket of the same level.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
595 Literals in this bracketed form can run for several lines,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
596 do not interpret any escape sequences,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
597 and ignore long brackets of any other level.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
598 Any kind of end-of-line sequence
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
599 (carriage return, newline, carriage return followed by newline,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
600 or newline followed by carriage return)
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
601 is converted to a simple newline.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
602 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
603
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
604 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
605 Any character in a literal string not
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
606 explicitly affected by the previous rules represents itself.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
607 However, Luan opens files for parsing in text mode,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
608 and the system file functions may have problems with
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
609 some control characters.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
610 So, it is safer to represent
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
611 non-text data as a quoted literal with
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
612 explicit escape sequences for non-text characters.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
613 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
614
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
615 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
616 For convenience,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
617 when the opening long bracket is immediately followed by a newline,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
618 the newline is not included in the string.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
619 As an example
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
620 the five literal strings below denote the same string:
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
621 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
622
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
623 <pre>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
624 a = 'alo\n123"'
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
625 a = "alo\n123\""
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
626 a = '\97lo\10\04923"'
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
627 a = [[alo
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
628 123"]]
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
629 a = [==[
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
630 alo
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
631 123"]==]
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
632 </pre>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
633
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
634 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
635 A <em>numerical constant</em> (or <em>numeral</em>)
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
636 can be written with an optional fractional part
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
637 and an optional decimal exponent,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
638 marked by a letter '<code>e</code>' or '<code>E</code>'.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
639 Luan also accepts hexadecimal constants,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
640 which start with <code>0x</code> or <code>0X</code>.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
641 Hexadecimal constants also accept an optional fractional part
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
642 plus an optional binary exponent,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
643 marked by a letter '<code>p</code>' or '<code>P</code>'.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
644 A numeric constant with a fractional dot or an exponent
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
645 denotes a float;
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
646 otherwise it denotes an integer.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
647 Examples of valid integer constants are
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
648 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
649
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
650 <pre>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
651 3 345 0xff 0xBEBADA
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
652 </pre>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
653
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
654 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
655 Examples of valid float constants are
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
656 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
657
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
658 <pre>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
659 3.0 3.1416 314.16e-2 0.31416E1 34e1
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
660 0x0.1E 0xA23p-4 0X1.921FB54442D18P+1
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
661 </pre>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
662
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
663 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
664 A <em>comment</em> starts with a double hyphen (<code>--</code>)
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
665 anywhere outside a string.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
666 If the text immediately after <code>--</code> is not an opening long bracket,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
667 the comment is a <em>short comment</em>,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
668 which runs until the end of the line.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
669 Otherwise, it is a <em>long comment</em>,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
670 which runs until the corresponding closing long bracket.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
671 Long comments are frequently used to disable code temporarily.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
672 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
673 <%
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
674 end
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
675 }
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
676 vars = {
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
677 title = "Variables"
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
678 content = function()
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
679 %>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
680 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
681 Variables are places that store values.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
682 There are three kinds of variables in Luan:
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
683 global variables, local variables, and table fields.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
684 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
685
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
686 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
687 A single name can denote a global variable or a local variable
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
688 (or a function's formal parameter,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
689 which is a particular kind of local variable):
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
690 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
691
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
692 <pre>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
693 var ::= Name
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
694 </pre>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
695
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
696 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
697 Name denotes identifiers, as defined in <a href="#lex">Lexical Conventions</a>.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
698 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
699
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
700 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
701 Local variables are <em>lexically scoped</em>:
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
702 local variables can be freely accessed by functions
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
703 defined inside their scope (see <a href="#visibility">Visibility Rules</a>).
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
704 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
705
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
706 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
707 Before the first assignment to a variable, its value is <b>nil</b>.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
708 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
709
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
710 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
711 Square brackets are used to index a table:
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
712 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
713
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
714 <pre>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
715 var ::= prefixexp &lsquo;<b>[</b>&rsquo; exp &lsquo;<b>]</b>&rsquo;
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
716 </pre>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
717
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
718 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
719 The meaning of accesses to table fields can be changed via metatables.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
720 An access to an indexed variable <code>t[i]</code> is equivalent to
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
721 a call <code>gettable_event(t,i)</code>.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
722 (See <a href="#meta">Metatables and Metamethods</a> for a complete description of the
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
723 <code>gettable_event</code> function.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
724 This function is not defined or callable in Luan.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
725 We use it here only for explanatory purposes.)
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
726 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
727
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
728 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
729 The syntax <code>var.Name</code> is just syntactic sugar for
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
730 <code>var["Name"]</code>:
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
731 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
732
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
733 <pre>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
734 var ::= prefixexp &lsquo;<b>.</b>&rsquo; Name
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
735 </pre>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
736
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
737 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
738 Global variables are not available by default. To enable global variable, you must define <code>_ENV</code> as a local variable whose value is a table. If <code>_ENV</code> is not defined, then an unrecognized variable name will produce a compile error. If <code>_ENV</code> is defined then an access to an unrecognized variable name will be consider a global variable. So then an acces to global variable <code>x</code>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
739 is equivalent to <code>_ENV.x</code>.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
740 Due to the way that chunks are compiled,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
741 <code>_ENV</code> is never a global name (see <a href="#env">Environments</a>).
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
742 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
743 <%
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
744 end
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
745 }
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
746 stmt = {
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
747 title = "Statements"
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
748 content = function()
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
749 %>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
750 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
751 Luan supports an almost conventional set of statements,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
752 similar to those in Pascal or C.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
753 This set includes
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
754 assignments, control structures, function calls,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
755 and variable declarations.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
756 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
757 <%
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
758 end
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
759 subs = {
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
760 blocks = {
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
761 title = "Blocks"
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
762 content = function()
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
763 %>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
764 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
765 A block is a list of statements,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
766 which are executed sequentially:
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
767 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
768
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
769 <pre>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
770 block ::= {stat}
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
771 </pre>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
772
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
773 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
774 Luan has <em>empty statements</em>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
775 that allow you to separate statements with semicolons,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
776 start a block with a semicolon
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
777 or write two semicolons in sequence:
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
778 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
779
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
780 <pre>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
781 stat ::= &lsquo;<b>;</b>&rsquo;
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
782 </pre>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
783
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
784 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
785 A block can be explicitly delimited to produce a single statement:
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
786 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
787
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
788 <pre>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
789 stat ::= <b>do</b> block end_do
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
790 end_do ::= <b>end_do</b> | <b>end</b>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
791 </pre>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
792
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
793 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
794 Explicit blocks are useful
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
795 to control the scope of variable declarations.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
796 Explicit blocks are also sometimes used to
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
797 add a <b>return</b> statement in the middle
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
798 of another block (see <a href="#control">Control Structures</a>).
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
799 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
800 <%
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
801 end
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
802 }
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
803 chunks = {
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
804 title = "Chunks"
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
805 content = function()
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
806 %>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
807 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
808 The unit of compilation of Luan is called a <em>chunk</em>.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
809 Syntactically,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
810 a chunk is simply a block:
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
811 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
812
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
813 <pre>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
814 chunk ::= block
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
815 </pre>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
816
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
817 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
818 Luan handles a chunk as the body of an anonymous function
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
819 with a variable number of arguments
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
820 (see <a href="#fn_def">Function Definitions</a>).
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
821 As such, chunks can define local variables,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
822 receive arguments, and return values.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
823 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
824
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
825 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
826 A chunk can be stored in a file or in a string inside the host program.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
827 To execute a chunk,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
828 Luan first <em>loads</em> it,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
829 compiling the chunk's code,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
830 and then Luan executes the compiled code.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
831 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
832 <%
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
833 end
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
834 }
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
835 assignment = {
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
836 title = "Assignment"
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
837 content = function()
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
838 %>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
839 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
840 Luan allows multiple assignments.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
841 Therefore, the syntax for assignment
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
842 defines a list of variables on the left side
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
843 and a list of expressions on the right side.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
844 The elements in both lists are separated by commas:
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
845 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
846
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
847 <pre>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
848 stat ::= varlist &lsquo;<b>=</b>&rsquo; explist
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
849 varlist ::= var {&lsquo;<b>,</b>&rsquo; var}
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
850 explist ::= exp {&lsquo;<b>,</b>&rsquo; exp}
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
851 </pre>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
852
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
853 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
854 Expressions are discussed in <a href="#expressions">Expressions</a>.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
855 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
856
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
857 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
858 Before the assignment,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
859 the list of values is <em>adjusted</em> to the length of
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
860 the list of variables.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
861 If there are more values than needed,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
862 the excess values are thrown away.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
863 If there are fewer values than needed,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
864 the list is extended with as many <b>nil</b>'s as needed.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
865 If the list of expressions ends with a function call,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
866 then all values returned by that call enter the list of values,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
867 before the adjustment
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
868 (except when the call is enclosed in parentheses; see <a href="#expressions">Expressions</a>).
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
869 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
870
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
871 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
872 The assignment statement first evaluates all its expressions
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
873 and only then the assignments are performed.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
874 Thus the code
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
875 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
876
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
877 <pre>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
878 i = 3
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
879 i, a[i] = i+1, 20
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
880 </pre>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
881
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
882 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
883 sets <code>a[3]</code> to 20, without affecting <code>a[4]</code>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
884 because the <code>i</code> in <code>a[i]</code> is evaluated (to 3)
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
885 before it is assigned&nbsp;4.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
886 Similarly, the line
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
887 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
888
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
889 <pre>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
890 x, y = y, x
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
891 </pre>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
892
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
893 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
894 exchanges the values of <code>x</code> and <code>y</code>,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
895 and
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
896 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
897
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
898 <pre>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
899 x, y, z = y, z, x
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
900 </pre>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
901
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
902 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
903 cyclically permutes the values of <code>x</code>, <code>y</code>, and <code>z</code>.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
904 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
905
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
906 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
907 The meaning of assignments to global variables
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
908 and table fields can be changed via metatables.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
909 An assignment to an indexed variable <code>t[i] = val</code> is equivalent to
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
910 <code>settable_event(t,i,val)</code>.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
911 (See <a href="#meta">Metatables and Metamethods</a> for a complete description of the
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
912 <code>settable_event</code> function.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
913 This function is not defined or callable in Luan.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
914 We use it here only for explanatory purposes.)
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
915 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
916
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
917 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
918 An assignment to a global name <code>x = val</code>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
919 is equivalent to the assignment
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
920 <code>_ENV.x = val</code> (see <a href="#env">Environments</a>).
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
921 Global names are only available when <code>_ENV</code> is defined.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
922 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
923 <%
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
924 end
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
925 }
1660
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
926 control = {
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
927 title = "Control Structures"
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
928 content = function()
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
929 %>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
930 <p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
931 The control structures
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
932 <b>if</b>, <b>while</b>, and <b>repeat</b> have the usual meaning and
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
933 familiar syntax:
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
934 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
935
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
936 <pre>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
937 stat ::= <b>while</b> exp <b>do</b> block end_while
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
938 stat ::= <b>repeat</b> block <b>until</b> exp
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
939 stat ::= <b>if</b> exp <b>then</b> block {<b>elseif</b> exp <b>then</b> block} [<b>else</b> block] end_if
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
940 end_while ::= <b>end_while</b> | <b>end</b>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
941 end_if ::= <b>end_if</b> | <b>end</b>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
942 </pre>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
943
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
944 <p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
945 Luan also has a <b>for</b> statement (see <a href="#for">For Statement</a>).
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
946 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
947
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
948 <p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
949 The condition expression of a
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
950 control structure must be a boolean.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
951 Any other value type will produce an error.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
952 This helps catch errors and makes code more readable.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
953 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
954
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
955 <p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
956 In the <b>repeat</b>&ndash;<b>until</b> loop,
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
957 the inner block does not end at the <b>until</b> keyword,
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
958 but only after the condition.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
959 So, the condition can refer to local variables
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
960 declared inside the loop block.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
961 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
962
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
963 <p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
964 The <b>break</b> statement terminates the execution of a
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
965 <b>while</b>, <b>repeat</b>, or <b>for</b> loop,
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
966 skipping to the next statement after the loop:
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
967 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
968
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
969 <pre>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
970 stat ::= <b>break</b>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
971 </pre>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
972
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
973 <p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
974 A <b>break</b> ends the innermost enclosing loop.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
975 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
976
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
977 <p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
978 The <b>continue</b> statement jumps to the beginning of a
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
979 <b>while</b>, <b>repeat</b>, or <b>for</b> loop for next iteration,
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
980 skipping the execution of statements inside the body of loop for the current iteration:
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
981 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
982
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
983 <pre>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
984 stat ::= <b>continue</b>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
985 </pre>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
986
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
987 <p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
988 The <b>return</b> statement is used to return values
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
989 from a function or a chunk
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
990 (which is an anonymous function).
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
991 Functions can return more than one value,
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
992 so the syntax for the <b>return</b> statement is
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
993 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
994
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
995 <pre>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
996 stat ::= <b>return</b> [explist] [&lsquo;<b>;</b>&rsquo;]
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
997 </pre>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
998 <%
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
999 end
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1000 }
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1001 ["for"] = {
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1002 title = "For Statement"
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1003 content = function()
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1004 %>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1005 <p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1006 The <b>for</b> statement works over functions,
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1007 called <em>iterators</em>.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1008 On each iteration, the iterator function is called to produce a new value,
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1009 stopping when this new value is <b>nil</b>.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1010 The <b>for</b> loop has the following syntax:
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1011 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1012
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1013 <pre>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1014 stat ::= <b>for</b> namelist <b>in</b> exp <b>do</b> block end_for
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1015 namelist ::= Name {&lsquo;<b>,</b>&rsquo; Name}
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1016 end_for ::= <b>end_for</b> | <b>end</b>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1017 </pre>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1018
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1019 <p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1020 A <b>for</b> statement like
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1021 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1022
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1023 <pre>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1024 for <em>var_1</em>, &middot;&middot;&middot;, <em>var_n</em> in <em>exp</em> do <em>block</em> end
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1025 </pre>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1026
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1027 <p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1028 is equivalent to the code:
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1029 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1030
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1031 <pre>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1032 do
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1033 local <em>f</em> = <em>exp</em>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1034 while true do
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1035 local <em>var_1</em>, &middot;&middot;&middot;, <em>var_n</em> = <em>f</em>()
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1036 if <em>var_1</em> == nil then break end
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1037 <em>block</em>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1038 end
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1039 end
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1040 </pre>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1041
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1042 <p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1043 Note the following:
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1044 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1045
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1046 <ul>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1047 <li>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1048 <code><em>exp</em></code> is evaluated only once.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1049 Its result is an <em>iterator</em> function.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1050 </li>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1051 <li>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1052 <code><em>f</em></code> is an invisible variable.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1053 The name is here for explanatory purposes only.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1054 </li>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1055 <li>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1056 You can use <b>break</b> to exit a <b>for</b> loop.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1057 </li>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1058 <li>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1059 The loop variables <code><em>var_i</em></code> are local to the loop;
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1060 you cannot use their values after the <b>for</b> ends.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1061 If you need these values,
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1062 then assign them to other variables before breaking or exiting the loop.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1063 </li>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1064 </ul>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1065 <%
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1066 end
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1067 }
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1068 ["try"] = {
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1069 title = "Try Statement"
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1070 content = function()
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1071 %>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1072 <p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1073 The <b>try</b> statement has the same semantics as in Java.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1074 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1075
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1076 <pre>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1077 stat ::= <b>try</b> block [<b>catch</b> Name block] [<b>finally</b> block] end_try
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1078 end_try ::= <b>end_try</b> | <b>end</b>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1079 </pre>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1080 <%
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1081 end
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1082 }
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1083 fn_stmt = {
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1084 title = "Function Calls as Statements"
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1085 content = function()
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1086 %>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1087 <p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1088 To allow possible side-effects,
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1089 function calls can be executed as statements:
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1090 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1091
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1092 <pre>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1093 stat ::= functioncall
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1094 </pre>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1095
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1096 <p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1097 In this case, all returned values are thrown away.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1098 Function calls are explained in <a href="#fn_calls">Function Calls</a>.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1099 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1100 <%
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1101 end
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1102 }
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1103 logical_stmt = {
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1104 title = "Logical Statement"
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1105 content = function()
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1106 %>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1107 <p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1108 <a href="#logical_ops">Logical expressions</a> can be statements.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1109 This is useful in cases like this:
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1110 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1111
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1112 <pre>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1113 x==5 or error "x should be 5"
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1114 </pre>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1115 <%
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1116 end
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1117 }
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1118 local_stmt = {
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1119 title = "Local Declarations"
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1120 content = function()
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1121 %>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1122 <p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1123 Local variables can be declared anywhere inside a block.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1124 The declaration can include an initial assignment:
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1125 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1126
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1127 <pre>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1128 stat ::= <b>local</b> namelist [&lsquo;<b>=</b>&rsquo; explist]
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1129 </pre>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1130
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1131 <p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1132 If present, an initial assignment has the same semantics
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1133 of a multiple assignment (see <a href="#assignment">Assignment</a>).
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1134 Otherwise, all variables are initialized with <b>nil</b>.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1135 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1136
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1137 <p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1138 A chunk is also a block (see <a href="#chunks">Chunks</a>),
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1139 and so local variables can be declared in a chunk outside any explicit block.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1140 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1141
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1142 <p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1143 The visibility rules for local variables are explained in <a href="#visibility">Visibility Rules</a>.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1144 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1145 <%
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1146 end
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1147 }
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1148 template_stmt = {
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1149 title = "Template Statements"
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1150 content = function()
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1151 %>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1152 <p>Template statements provide the full equivalent of <a href="http://en.wikipedia.org/wiki/JavaServer_Pages">JSP</a> but in a general way. Template statements write to standard output. For example:</p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1153 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1154
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1155 <pre>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1156 local name = "Bob"
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1157 %&gt;
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1158 Hello &lt;%= name %&gt;!
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1159 Bye &lt;%= name %&gt;.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1160 &lt;%
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1161 </pre>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1162
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1163 <p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1164 is equivalent to the code:
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1165 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1166
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1167 <pre>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1168 local name = "Bob"
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1169 require("luan:Io.luan").stdout.write( "Hello ", name , "!\nBye ", name , ".\n" )
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1170 </pre>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1171 <%
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1172 end
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1173 }
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1174 }
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1175 }
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1176 expressions = {
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1177 title = "Expressions"
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1178 content = function()
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1179 %>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1180 <p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1181 The basic expressions in Luan are the following:
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1182 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1183
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1184 <pre>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1185 exp ::= prefixexp
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1186 exp ::= <b>nil</b> | <b>false</b> | <b>true</b>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1187 exp ::= Numeral
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1188 exp ::= LiteralString
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1189 exp ::= functiondef
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1190 exp ::= tableconstructor
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1191 exp ::= &lsquo;<b>...</b>&rsquo;
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1192 exp ::= exp binop exp
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1193 exp ::= unop exp
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1194 prefixexp ::= var | functioncall | &lsquo;<b>(</b>&rsquo; exp &lsquo;<b>)</b>&rsquo;
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1195 </pre>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1196
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1197 <p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1198 Numerals and literal strings are explained in <a href="#lex">Lexical Conventions</a>;
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1199 variables are explained in <a href="#vars">Variables</a>;
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1200 function definitions are explained in <a href="#fn_def">Function Definitions</a>;
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1201 function calls are explained in <a href="#fn_calls">Function Calls</a>;
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1202 table constructors are explained in <a href="#constructors">Table Constructors</a>.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1203 Vararg expressions,
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1204 denoted by three dots ('<code>...</code>'), can only be used when
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1205 directly inside a vararg function;
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1206 they are explained in <a href="#fn_def">Function Definitions</a>.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1207 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1208
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1209 <p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1210 Binary operators comprise arithmetic operators (see <a href="#arithmetic">Arithmetic Operators</a>),
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1211 relational operators (see <a href="#relational">Relational Operators</a>), logical operators (see <a href="#logical_ops">Logical Operators</a>),
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1212 and the concatenation operator (see <a href="#concatenation">Concatenation</a>).
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1213 Unary operators comprise the unary minus (see <a href="#arithmetic">Arithmetic Operators</a>),
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1214 the unary logical <b>not</b> (see <a href="#logical_ops">Logical Operators</a>),
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1215 and the unary <em>length operator</em> (see <a href="#length">The Length Operator</a>).
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1216 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1217
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1218 <p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1219 Both function calls and vararg expressions can result in multiple values.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1220 If a function call is used as a statement (see <a href="#fn_stmt">Function Calls as Statements</a>),
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1221 then its return list is adjusted to zero elements,
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1222 thus discarding all returned values.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1223 If an expression is used as the last (or the only) element
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1224 of a list of expressions,
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1225 then no adjustment is made
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1226 (unless the expression is enclosed in parentheses).
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1227 In all other contexts,
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1228 Luan adjusts the result list to one element,
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1229 either discarding all values except the first one
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1230 or adding a single <b>nil</b> if there are no values.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1231 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1232
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1233 <p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1234 Here are some examples:
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1235 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1236
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1237 <pre>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1238 f() -- adjusted to 0 results
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1239 g(f(), x) -- f() is adjusted to 1 result
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1240 g(x, f()) -- g gets x plus all results from f()
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1241 a,b,c = f(), x -- f() is adjusted to 1 result (c gets nil)
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1242 a,b = ... -- a gets the first vararg parameter, b gets
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1243 -- the second (both a and b can get nil if there
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1244 -- is no corresponding vararg parameter)
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1245
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1246 a,b,c = x, f() -- f() is adjusted to 2 results
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1247 a,b,c = f() -- f() is adjusted to 3 results
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1248 return f() -- returns all results from f()
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1249 return ... -- returns all received vararg parameters
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1250 return x,y,f() -- returns x, y, and all results from f()
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1251 {f()} -- creates a list with all results from f()
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1252 {...} -- creates a list with all vararg parameters
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1253 {f(), nil} -- f() is adjusted to 1 result
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1254 </pre>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1255
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1256 <p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1257 Any expression enclosed in parentheses always results in only one value.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1258 Thus,
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1259 <code>(f(x,y,z))</code> is always a single value,
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1260 even if <code>f</code> returns several values.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1261 (The value of <code>(f(x,y,z))</code> is the first value returned by <code>f</code>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1262 or <b>nil</b> if <code>f</code> does not return any values.)
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1263 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1264 <%
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1265 end
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1266 subs = {
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1267 arithmetic = {
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1268 title = "Arithmetic Operators"
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1269 content = function()
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1270 %>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1271 <p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1272 Luan supports the following arithmetic operators:
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1273 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1274
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1275 <ul>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1276 <li><b><code>+</code>: </b>addition</li>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1277 <li><b><code>-</code>: </b>subtraction</li>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1278 <li><b><code>*</code>: </b>multiplication</li>
1680
9ef19f5ea973 add // operator
Franklin Schmidt <fschmidt@gmail.com>
parents: 1670
diff changeset
1279 <li><b><code>/</code>: </b>float division</li>
9ef19f5ea973 add // operator
Franklin Schmidt <fschmidt@gmail.com>
parents: 1670
diff changeset
1280 <li><b><code>//</code>: </b>floor division</li>
1660
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1281 <li><b><code>%</code>: </b>modulo</li>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1282 <li><b><code>^</code>: </b>exponentiation</li>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1283 <li><b><code>-</code>: </b>unary minus</li>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1284 </ul>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1285
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1286 <p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1287 Addition, subtraction, multiplication, division, and unary minus are the same as these operators in Java. Exponentiation uses Java's <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Math.html#pow(double,%20double)">Math.pow</a> function.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1288 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1289
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1290 <p>
1680
9ef19f5ea973 add // operator
Franklin Schmidt <fschmidt@gmail.com>
parents: 1670
diff changeset
1291 Floor division (//) is a division that rounds the quotient towards minus infinity, that is, the floor of the division of its operands.
9ef19f5ea973 add // operator
Franklin Schmidt <fschmidt@gmail.com>
parents: 1670
diff changeset
1292 </p>
9ef19f5ea973 add // operator
Franklin Schmidt <fschmidt@gmail.com>
parents: 1670
diff changeset
1293
9ef19f5ea973 add // operator
Franklin Schmidt <fschmidt@gmail.com>
parents: 1670
diff changeset
1294 <p>
1660
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1295 Modulo is defined as the remainder of a division
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1296 that rounds the quotient towards minus infinite (floor division).
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1297 (The Java modulo operator is not used.)
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1298 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1299 <%
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1300 end
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1301 }
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1302 conversions = {
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1303 title = "Coercions and Conversions"
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1304 content = function()
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1305 %>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1306 <p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1307 Luan generally avoids automatic conversions.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1308 String concatenation automatically converts all of its arguments to strings.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1309 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1310
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1311 <p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1312 Luan provides library functions for explicit type conversions.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1313 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1314 <%
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1315 end
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1316 }
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1317 relational = {
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1318 title = "Relational Operators"
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1319 content = function()
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1320 %>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1321 <p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1322 Luan supports the following relational operators:
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1323 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1324
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1325 <ul>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1326 <li><b><code>==</code>: </b>equality</li>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1327 <li><b><code>~=</code>: </b>inequality</li>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1328 <li><b><code>&lt;</code>: </b>less than</li>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1329 <li><b><code>&gt;</code>: </b>greater than</li>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1330 <li><b><code>&lt;=</code>: </b>less or equal</li>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1331 <li><b><code>&gt;=</code>: </b>greater or equal</li>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1332 </ul>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1333
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1334 <p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1335 These operators always result in <b>false</b> or <b>true</b>.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1336 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1337
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1338 <p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1339 Equality (<code>==</code>) first compares the type of its operands.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1340 If the types are different, then the result is <b>false</b>.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1341 Otherwise, the values of the operands are compared.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1342 Strings, numbers, and binary values are compared in the obvious way (by value).
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1343 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1344
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1345 <p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1346 Tables
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1347 are compared by reference:
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1348 two objects are considered equal only if they are the same object.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1349 Every time you create a new table,
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1350 it is different from any previously existing table.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1351 Closures are also compared by reference.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1352 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1353
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1354 <p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1355 You can change the way that Luan compares tables
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1356 by using the "eq" metamethod (see <a href="#meta">Metatables and Metamethods</a>).
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1357 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1358
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1359 <p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1360 Java values are compared for equality with the Java <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#equals(java.lang.Object)"><code>equals</code></a> method.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1361 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1362
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1363 <p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1364 Equality comparisons do not convert strings to numbers
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1365 or vice versa.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1366 Thus, <code>"0"==0</code> evaluates to <b>false</b>,
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1367 and <code>t[0]</code> and <code>t["0"]</code> denote different
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1368 entries in a table.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1369 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1370
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1371 <p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1372 The operator <code>~=</code> is exactly the negation of equality (<code>==</code>).
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1373 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1374
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1375 <p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1376 The order operators work as follows.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1377 If both arguments are numbers,
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1378 then they are compared following
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1379 the usual rule for binary operations.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1380 Otherwise, if both arguments are strings,
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1381 then their values are compared according to the current locale.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1382 Otherwise, Luan tries to call the "lt" or the "le"
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1383 metamethod (see <a href="#meta">Metatables and Metamethods</a>).
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1384 A comparison <code>a &gt; b</code> is translated to <code>b &lt; a</code>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1385 and <code>a &gt;= b</code> is translated to <code>b &lt;= a</code>.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1386 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1387 <%
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1388 end
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1389 }
1667
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1390 logical_ops = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1391 title = "Logical Operators"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1392 content = function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1393 %>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1394 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1395 The logical operators in Luan are
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1396 <b>and</b>, <b>or</b>, and <b>not</b>.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1397 The <b>and</b> and <b>or</b> operators consider both <b>false</b> and <b>nil</b> as false
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1398 and anything else as true.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1399 Like the control structures (see <a href="#control">Control Structures</a>),
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1400 the <b>not</b> operator requires a boolean value.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1401 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1402
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1403 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1404 The negation operator <b>not</b> always returns <b>false</b> or <b>true</b>.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1405 The conjunction operator <b>and</b> returns its first argument
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1406 if this value is <b>false</b> or <b>nil</b>;
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1407 otherwise, <b>and</b> returns its second argument.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1408 The disjunction operator <b>or</b> returns its first argument
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1409 if this value is different from <b>nil</b> and <b>false</b>;
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1410 otherwise, <b>or</b> returns its second argument.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1411 Both <b>and</b> and <b>or</b> use short-circuit evaluation;
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1412 that is,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1413 the second operand is evaluated only if necessary.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1414 Here are some examples:
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1415 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1416
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1417 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1418 10 or 20 --&gt; 10
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1419 10 or error() --&gt; 10
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1420 nil or "a" --&gt; "a"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1421 nil and 10 --&gt; nil
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1422 false and error() --&gt; false
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1423 false and nil --&gt; false
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1424 false or nil --&gt; nil
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1425 10 and 20 --&gt; 20
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1426 </pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1427
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1428 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1429 (In this manual,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1430 <code>--&gt;</code> indicates the result of the preceding expression.)
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1431 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1432 <%
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1433 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1434 }
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1435 concatenation = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1436 title = "Concatenation"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1437 content = function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1438 %>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1439 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1440 The string concatenation operator in Luan is
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1441 denoted by two dots ('<code>..</code>').
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1442 All operands are converted to strings.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1443 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1444 <%
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1445 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1446 }
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1447 length = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1448 title = "The Length Operator"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1449 content = function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1450 %>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1451 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1452 The length operator is denoted by the unary prefix operator <code>#</code>.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1453 The length of a string is its number of characters.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1454 The length of a binary is its number of bytes.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1455 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1456
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1457 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1458 A program can modify the behavior of the length operator for
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1459 any table through the <code>__len</code> metamethod (see <a href="#meta">Metatables and Metamethods</a>).
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1460 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1461
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1462 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1463 Unless a <code>__len</code> metamethod is given,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1464 the length of a table <code>t</code> is defined
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1465 as the number of elements in <em>sequence</em>,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1466 that is,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1467 the size of the set of its positive numeric keys is equal to <em>{1..n}</em>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1468 for some non-negative integer <em>n</em>.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1469 In that case, <em>n</em> is its length.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1470 Note that a table like
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1471 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1472
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1473 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1474 {10, 20, nil, 40}
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1475 </pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1476
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1477 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1478 has a length of <code>2</code>, because that is the last key in sequence.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1479 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1480 <%
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1481 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1482 }
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1483 precedence = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1484 title = "Precedence"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1485 content = function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1486 %>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1487 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1488 Operator precedence in Luan follows the table below,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1489 from lower to higher priority:
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1490 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1491
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1492 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1493 or
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1494 and
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1495 &lt; &gt; &lt;= &gt;= ~= ==
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1496 ..
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1497 + -
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1498 * / %
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1499 unary operators (not # -)
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1500 ^
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1501 </pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1502
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1503 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1504 As usual,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1505 you can use parentheses to change the precedences of an expression.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1506 The concatenation ('<code>..</code>') and exponentiation ('<code>^</code>')
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1507 operators are right associative.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1508 All other binary operators are left associative.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1509 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1510 <%
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1511 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1512 }
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1513 constructors = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1514 title = "Table Constructors"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1515 content = function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1516 %>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1517 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1518 Table constructors are expressions that create tables.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1519 Every time a constructor is evaluated, a new table is created.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1520 A constructor can be used to create an empty table
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1521 or to create a table and initialize some of its fields.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1522 The general syntax for constructors is
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1523 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1524
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1525 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1526 tableconstructor ::= &lsquo;<b>{</b>&rsquo; fieldlist &lsquo;<b>}</b>&rsquo;
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1527 fieldlist ::= [field] {fieldsep [field]}
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1528 field ::= &lsquo;<b>[</b>&rsquo; exp &lsquo;<b>]</b>&rsquo; &lsquo;<b>=</b>&rsquo; exp | Name &lsquo;<b>=</b>&rsquo; exp | exp
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1529 fieldsep ::= &lsquo;<b>,</b>&rsquo; | &lsquo;<b>;</b>&rsquo; | <b>end_of_line</b>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1530 </pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1531
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1532 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1533 Each field of the form <code>[exp1] = exp2</code> adds to the new table an entry
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1534 with key <code>exp1</code> and value <code>exp2</code>.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1535 A field of the form <code>name = exp</code> is equivalent to
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1536 <code>["name"] = exp</code>.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1537 Finally, fields of the form <code>exp</code> are equivalent to
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1538 <code>[i] = exp</code>, where <code>i</code> are consecutive integers
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1539 starting with 1.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1540 Fields in the other formats do not affect this counting.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1541 For example,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1542 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1543
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1544 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1545 a = { [f(1)] = g; "x", "y"; x = 1, f(x), [30] = 23; 45 }
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1546 </pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1547
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1548 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1549 is equivalent to
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1550 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1551
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1552 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1553 do
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1554 local t = {}
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1555 t[f(1)] = g
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1556 t[1] = "x" -- 1st exp
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1557 t[2] = "y" -- 2nd exp
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1558 t.x = 1 -- t["x"] = 1
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1559 t[3] = f(x) -- 3rd exp
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1560 t[30] = 23
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1561 t[4] = 45 -- 4th exp
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1562 a = t
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1563 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1564 </pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1565
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1566 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1567 The order of the assignments in a constructor is undefined.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1568 (This order would be relevant only when there are repeated keys.)
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1569 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1570
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1571 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1572 If the last field in the list has the form <code>exp</code>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1573 and the expression is a function call or a vararg expression,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1574 then all values returned by this expression enter the list consecutively
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1575 (see <a href="#fn_calls">Function Calls</a>).
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1576 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1577
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1578 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1579 The field list can have an optional trailing separator,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1580 as a convenience for machine-generated code.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1581 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1582 <%
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1583 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1584 }
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1585 fn_calls = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1586 title = "Function Calls"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1587 content = function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1588 %>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1589 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1590 A function call in Luan has the following syntax:
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1591 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1592
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1593 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1594 functioncall ::= prefixexp args
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1595 </pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1596
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1597 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1598 In a function call,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1599 first prefixexp and args are evaluated.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1600 The value of prefixexp must have type <em>function</em>.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1601 This function is called
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1602 with the given arguments.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1603 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1604
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1605 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1606 Arguments have the following syntax:
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1607 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1608
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1609 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1610 args ::= &lsquo;<b>(</b>&rsquo; [explist] &lsquo;<b>)</b>&rsquo;
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1611 args ::= tableconstructor
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1612 args ::= LiteralString
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1613 </pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1614
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1615 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1616 All argument expressions are evaluated before the call.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1617 A call of the form <code>f{<em>fields</em>}</code> is
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1618 syntactic sugar for <code>f({<em>fields</em>})</code>;
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1619 that is, the argument list is a single new table.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1620 A call of the form <code>f'<em>string</em>'</code>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1621 (or <code>f"<em>string</em>"</code> or <code>f[[<em>string</em>]]</code>)
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1622 is syntactic sugar for <code>f('<em>string</em>')</code>;
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1623 that is, the argument list is a single literal string.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1624 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1625 <%
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1626 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1627 }
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1628 fn_def = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1629 title = "Function Definitions"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1630 content = function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1631 %>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1632 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1633 The syntax for function definition is
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1634 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1635
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1636 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1637 functiondef ::= <b>function</b> funcbody
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1638 funcbody ::= &lsquo;<b>(</b>&rsquo; [parlist] &lsquo;<b>)</b>&rsquo; block end_function
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1639 end_function ::= <b>end_function</b> | <b>end</b>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1640 </pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1641
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1642 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1643 The following syntactic sugar simplifies function definitions:
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1644 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1645
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1646 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1647 stat ::= <b>function</b> funcname funcbody
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1648 stat ::= <b>local</b> <b>function</b> Name funcbody
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1649 funcname ::= Name {&lsquo;<b>.</b>&rsquo; Name} [&lsquo;<b>:</b>&rsquo; Name]
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1650 </pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1651
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1652 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1653 The statement
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1654 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1655
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1656 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1657 function f () <em>body</em> end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1658 </pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1659
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1660 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1661 translates to
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1662 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1663
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1664 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1665 f = function () <em>body</em> end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1666 </pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1667
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1668 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1669 The statement
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1670 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1671
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1672 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1673 function t.a.b.c.f () <em>body</em> end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1674 </pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1675
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1676 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1677 translates to
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1678 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1679
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1680 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1681 t.a.b.c.f = function () <em>body</em> end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1682 </pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1683
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1684 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1685 The statement
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1686 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1687
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1688 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1689 local function f () <em>body</em> end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1690 </pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1691
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1692 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1693 translates to
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1694 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1695
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1696 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1697 local f; f = function () <em>body</em> end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1698 </pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1699
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1700 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1701 not to
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1702 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1703
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1704 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1705 local f = function () <em>body</em> end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1706 </pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1707
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1708 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1709 (This only makes a difference when the body of the function
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1710 contains references to <code>f</code>.)
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1711 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1712
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1713 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1714 A function definition is an executable expression,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1715 whose value has type <em>function</em>.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1716 When Luan precompiles a chunk,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1717 all its function bodies are precompiled too.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1718 Then, whenever Luan executes the function definition,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1719 the function is <em>instantiated</em> (or <em>closed</em>).
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1720 This function instance (or <em>closure</em>)
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1721 is the final value of the expression.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1722 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1723
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1724 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1725 Parameters act as local variables that are
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1726 initialized with the argument values:
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1727 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1728
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1729 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1730 parlist ::= namelist [&lsquo;<b>,</b>&rsquo; &lsquo;<b>...</b>&rsquo;] | &lsquo;<b>...</b>&rsquo;
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1731 </pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1732
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1733 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1734 When a function is called,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1735 the list of arguments is adjusted to
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1736 the length of the list of parameters if the list is too short,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1737 unless the function is a <em>vararg function</em>,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1738 which is indicated by three dots ('<code>...</code>')
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1739 at the end of its parameter list.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1740 A vararg function does not adjust its argument list;
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1741 instead, it collects all extra arguments and supplies them
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1742 to the function through a <em>vararg expression</em>,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1743 which is also written as three dots.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1744 The value of this expression is a list of all actual extra arguments,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1745 similar to a function with multiple results.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1746 If a vararg expression is used inside another expression
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1747 or in the middle of a list of expressions,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1748 then its return list is adjusted to one element.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1749 If the expression is used as the last element of a list of expressions,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1750 then no adjustment is made
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1751 (unless that last expression is enclosed in parentheses).
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1752 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1753
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1754 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1755 As an example, consider the following definitions:
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1756 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1757 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1758 function f(a, b) end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1759 function g(a, b, ...) end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1760 function r() return 1,2,3 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1761 </pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1762
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1763 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1764 Then, we have the following mapping from arguments to parameters and
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1765 to the vararg expression:
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1766 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1767 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1768 CALL PARAMETERS
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1769
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1770 f(3) a=3, b=nil
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1771 f(3, 4) a=3, b=4
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1772 f(3, 4, 5) runtime error
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1773 f(r(), 10) runtime error
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1774 f(r()) runtime error
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1775
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1776 g(3) a=3, b=nil, ... --&gt; (nothing)
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1777 g(3, 4) a=3, b=4, ... --&gt; (nothing)
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1778 g(3, 4, 5, 8) a=3, b=4, ... --&gt; 5 8
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1779 g(5, r()) a=5, b=1, ... --&gt; 2 3
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1780 </pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1781
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1782 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1783 Results are returned using the <b>return</b> statement (see <a href="#control">Control Structures</a>).
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1784 If control reaches the end of a function
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1785 without encountering a <b>return</b> statement,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1786 then the function returns with no results.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1787 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1788 <%
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1789 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1790 }
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1791 }
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1792 }
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1793 visibility = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1794 title = "Visibility Rules"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1795 content = function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1796 %>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1797 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1798 Luan is a lexically scoped language.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1799 The scope of a local variable begins at the first statement after
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1800 its declaration and lasts until the last non-void statement
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1801 of the innermost block that includes the declaration.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1802 Consider the following example:
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1803 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1804 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1805 x = 10 -- global variable
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1806 do -- new block
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1807 local x = x -- new 'x', with value 10
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1808 print(x) --&gt; 10
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1809 x = x+1
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1810 do -- another block
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1811 local x = x+1 -- another 'x'
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1812 print(x) --&gt; 12
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1813 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1814 print(x) --&gt; 11
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1815 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1816 print(x) --&gt; 10 (the global one)
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1817 </pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1818
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1819 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1820 Notice that, in a declaration like <code>local x = x</code>,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1821 the new <code>x</code> being declared is not in scope yet,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1822 and so the second <code>x</code> refers to the outside variable.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1823 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1824
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1825 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1826 Because of the lexical scoping rules,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1827 local variables can be freely accessed by functions
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1828 defined inside their scope.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1829 A local variable used by an inner function is called
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1830 an <em>upvalue</em>, or <em>external local variable</em>,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1831 inside the inner function.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1832 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1833
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1834 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1835 Notice that each execution of a <b>local</b> statement
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1836 defines new local variables.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1837 Consider the following example:
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1838 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1839 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1840 a = {}
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1841 local x = 20
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1842 for i=1,10 do
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1843 local y = 0
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1844 a[i] = function () y=y+1; return x+y end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1845 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1846 </pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1847
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1848 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1849 The loop creates ten closures
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1850 (that is, ten instances of the anonymous function).
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1851 Each of these closures uses a different <code>y</code> variable,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1852 while all of them share the same <code>x</code>.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1853 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1854 <%
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1855 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1856 }
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1857 }
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1858 }
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1859 libs = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1860 title = "Standard Libraries"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1861 content = function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1862 %>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1863 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1864 The standard Luan libraries provide useful functions
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1865 that are implemented both in Java and in Luan itself.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1866 How each function is implemented shouldn't matter to the user.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1867 Some of these functions provide essential services to the language
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1868 (e.g., <a href="#Luan.type"><code>type</code></a> and <a href="#Luan.get_metatable"><code>get_metatable</code></a>);
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1869 others provide access to "outside" services (e.g., I/O).
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1870 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1871 <%
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1872 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1873 subs = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1874 default_lib = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1875 title = "Default Environment"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1876 content = function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1877 %>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1878 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1879 This is provided by default as a local variable for any Luan code as described in <a href="#env">Environments</a>.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1880 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1881 <%
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1882 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1883 subs = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1884 require = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1885 title = "<code>require (mod_uri)</code>"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1886 content = function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1887 %>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1888 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1889 Example use:
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1890 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1891 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1892 local Table = require "luan:Table.luan"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1893 </pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1894
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1895 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1896 Could be defined as:
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1897 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1898 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1899 local function require(mod_name)
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1900 return <a href="#Package.load">Package.load</a>(mod_name) or <a href="#Luan.error">Luan.error</a>("module '"..mod_name.."' not found")
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1901 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1902 </pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1903
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1904 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1905 A special case is:
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1906 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1907 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1908 require "java"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1909 </pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1910
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1911 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1912 This enables Java in the current chunk if that chunk has permission to use Java. If the chunk doesn't have permission to use Java, then an error is thrown.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1913 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1914 <%
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1915 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1916 }
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1917 }
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1918 }
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1919 luan_lib = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1920 title = "Basic Functions"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1921 content = function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1922 %>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1923 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1924 Include this library by:
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1925 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1926 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1927 local Luan = require "luan:Luan.luan"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1928 </pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1929
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1930 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1931 The basic library provides basic functions to Luan that don't depend on other libaries.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1932 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1933 <%
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1934 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1935 subs = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1936 ["Luan.do_file"] = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1937 title = "<code>Luan.do_file ([uri])</code>"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1938 content = function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1939 %>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1940 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1941 Could be defined as:
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1942 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1943 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1944 function Luan.do_file(uri)
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1945 local fn = <a href="#Luan.load_file">Luan.load_file</a>(uri) or <a href="#Luan.error">Luan.error</a>("file '"..uri.."' not found")
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1946 return fn()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1947 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1948 </pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1949 <%
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1950 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1951 }
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1952 ["Luan.error"] = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1953 title = "<code>Luan.error (message)</code>"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1954 content = function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1955 %>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1956 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1957 Throws an error containing the message.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1958 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1959
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1960 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1961 Could be defined as:
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1962 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1963 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1964 function Luan.error(message)
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1965 <a href="#Luan.new_error">Luan.new_error</a>(message).throw()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1966 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1967 </pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1968 <%
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1969 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1970 }
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1971 ["Luan.eval"] = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1972 title = "<code>Luan.eval (text [, source_name [, env]])</code>"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1973 content = function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1974 %>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1975 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1976 Evaluates <code>text</code> as a Luan expression.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1977 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1978
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1979 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1980 Could be defined as:
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1981 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1982 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1983 function Luan.eval(text,source_name, env)
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1984 return <a href="#Luan.load">Luan.load</a>( "return "..text, source_name or "eval", env )()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1985 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1986 </pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1987 <%
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1988 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1989 }
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1990 ["Luan.get_metatable"] = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1991 title = "<code>Luan.get_metatable (table)</code>"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1992 content = function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1993 %>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1994 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1995 If <code>table</code> does not have a metatable, returns <b>nil</b>.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1996 Otherwise,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1997 if the table's metatable has a <code>"__metatable"</code> field,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1998 returns the associated value.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1999 Otherwise, returns the metatable of the given table.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2000 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2001 <%
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2002 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2003 }
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2004 ["Luan.hash_code"] = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2005 title = "<code>Luan.hash_code (v)</code>"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2006 content = function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2007 %>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2008 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2009 Returns the hash code of <code>v</code>.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2010 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2011 <%
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2012 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2013 }
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2014 ["Luan.ipairs"] = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2015 title = "<code>Luan.ipairs (t)</code>"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2016 content = function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2017 %>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2018 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2019 Returns an iterator function
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2020 so that the construction
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2021 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2022 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2023 for i,v in ipairs(t) do <em>body</em> end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2024 </pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2025
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2026 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2027 will iterate over the key&ndash;value pairs
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2028 (<code>1,t[1]</code>), (<code>2,t[2]</code>), ...,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2029 up to the first nil value.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2030 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2031
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2032 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2033 Could be defined as:
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2034 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2035 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2036 function Luan.ipairs(t)
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2037 local i = 0
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2038 return function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2039 if i < #t then
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2040 i = i + 1
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2041 return i, t[i]
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2042 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2043 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2044 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2045 </pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2046 <%
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2047 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2048 }
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2049 ["Luan.load"] = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2050 title = "<code>Luan.load (text, [source_name [, env [, persist]]])</code>"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2051 content = function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2052 %>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2053 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2054 Loads a chunk.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2055 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2056
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2057 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2058 The <code>text</code> is compiled.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2059 If there are no syntactic errors,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2060 returns the compiled chunk as a function;
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2061 otherwise, throws an error.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2062 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2063
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2064 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2065 The <code>source_name</code> parameter is a string saying where the text came from. It is used to produce error messages. Defaults to "load".
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2066 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2067
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2068 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2069 If the <code>env</code> parameter is supplied, it becomes the <code>_ENV</code> of the chunk.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2070 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2071
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2072 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2073 The <code>persist</code> parameter is a boolean which determines if the compiled code is persistently cached to a temporary file. Defaults to <code>false</code>.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2074 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2075 <%
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2076 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2077 }
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2078 ["Luan.load_file"] = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2079 title = "<code>Luan.load_file (file_uri)</code>"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2080 content = function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2081 %>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2082 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2083 Similar to <a href="#Luan.load"><code>load</code></a>,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2084 but gets the chunk from file <code>file_uri</code>.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2085 <code>file_uri</code> can be a string or a uri table.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2086 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2087 <%
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2088 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2089 }
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2090 ["Luan.new_error"] = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2091 title = "<code>Luan.new_error (message)</code>"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2092 content = function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2093 %>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2094 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2095 Creates a new error table containing the message assigned to "<code>message</code>". The error table also contains a <code>throw</code> function which throws the error. The table also contains a list of stack trace elements where each stack trace element is a table containing "<code>source</code>", "<code>line</code>", and possible "<code>call_to</code>". The table also has a metatable containing "<code>__to_string</code>" to render the error.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2096 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2097
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2098 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2099 To print the current stack trace, you could do:
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2100 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2101 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2102 Io.print( Luan.new_error "stack" )
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2103 </pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2104 <%
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2105 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2106 }
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2107 ["Luan.pairs"] = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2108 title = "<code>Luan.pairs (t)</code>"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2109 content = function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2110 %>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2111 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2112 If <code>t</code> has a metamethod <code>__pairs</code>,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2113 calls it with <code>t</code> as argument and returns the
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2114 result from the call.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2115 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2116
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2117 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2118 Otherwise,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2119 returns a function
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2120 so that the construction
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2121 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2122 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2123 for k,v in pairs(t) do <em>body</em> end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2124 </pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2125
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2126 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2127 will iterate over all key&ndash;value pairs of table <code>t</code>.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2128 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2129 <%
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2130 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2131 }
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2132 ["Luan.range"] = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2133 title = "<code>Luan.range (start, stop [, step])</code>"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2134 content = function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2135 %>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2136 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2137 Based on <a href="https://docs.python.org/2/library/functions.html#range">the Python range() function</a>, this lets one iterate through a sequence of numbers.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2138 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2139
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2140 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2141 Example use:
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2142 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2143 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2144 for i in range(1,10) do
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2145 Io.print("count up:",i)
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2146 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2147 for i in range(10,0,-1) do
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2148 Io.print("count down:",i)
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2149 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2150 </pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2151
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2152 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2153 Could be defined as:
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2154 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2155 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2156 function Luan.range(start, stop, step)
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2157 step = step or 1
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2158 step == 0 and <a href="#Luan.error">Luan.error</a> "bad argument #3 (step may not be zero)"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2159 local i = start
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2160 return function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2161 if step > 0 and i <= stop or step < 0 and i >= stop then
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2162 local rtn = i
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2163 i = i + step
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2164 return rtn
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2165 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2166 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2167 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2168 </pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2169 <%
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2170 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2171 }
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2172 ["Luan.raw_equal"] = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2173 title = "<code>Luan.raw_equal (v1, v2)</code>"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2174 content = function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2175 %>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2176 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2177 Checks whether <code>v1</code> is equal to <code>v2</code>,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2178 without invoking any metamethod.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2179 Returns a boolean.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2180 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2181 <%
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2182 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2183 }
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2184 ["Luan.raw_get"] = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2185 title = "<code>Luan.raw_get (table, index)</code>"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2186 content = function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2187 %>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2188 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2189 Gets the real value of <code>table[index]</code>,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2190 without invoking any metamethod.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2191 <code>table</code> must be a table;
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2192 <code>index</code> may be any value.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2193 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2194 <%
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2195 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2196 }
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2197 ["Luan.raw_len"] = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2198 title = "<code>Luan.raw_len (v)</code>"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2199 content = function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2200 %>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2201 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2202 Returns the length of the object <code>v</code>,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2203 which must be a table or a string,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2204 without invoking any metamethod.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2205 Returns an integer.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2206 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2207 <%
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2208 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2209 }
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2210 ["Luan.raw_set"] = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2211 title = "<code>Luan.raw_set (table, index, value)</code>"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2212 content = function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2213 %>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2214 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2215 Sets the real value of <code>table[index]</code> to <code>value</code>,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2216 without invoking any metamethod.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2217 <code>table</code> must be a table,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2218 <code>index</code> any value different from <b>nil</b>,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2219 and <code>value</code> any Luan value.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2220 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2221 <%
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2222 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2223 }
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2224 ["Luan.set_metatable"] = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2225 title = "<code>Luan.set_metatable (table, metatable)</code>"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2226 content = function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2227 %>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2228 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2229 Sets the metatable for the given table.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2230 If <code>metatable</code> is <b>nil</b>,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2231 removes the metatable of the given table.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2232 If the original metatable has a <code>"__metatable"</code> field,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2233 raises an error.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2234 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2235 <%
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2236 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2237 }
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2238 ["Luan.stringify"] = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2239 title = "<code>Luan.stringify (v [,options])</code>"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2240 content = function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2241 %>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2242 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2243 Receives a value of any type and converts it to a string that is a Luan expression. <code>options</code> is a table. If <code>options.strict==true</code> then invalid types throw an error. Otherwise invalid types are represented but the resulting expression is invalid. If <code>options.number_types==true</code> then numbers will be wrapped in functions for their type.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2244 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2245 <%
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2246 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2247 }
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2248 ["Luan.to_string"] = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2249 title = "<code>Luan.to_string (v)</code>"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2250 content = function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2251 %>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2252 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2253 Receives a value of any type and
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2254 converts it to a string in a human-readable format.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2255 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2256
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2257 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2258 If the metatable of <code>v</code> has a <code>"__to_string"</code> field,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2259 then <code>to_string</code> calls the corresponding value
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2260 with <code>v</code> as argument,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2261 and uses the result of the call as its result.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2262 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2263 <%
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2264 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2265 }
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2266 ["Luan.type"] = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2267 title = "<code>Luan.type (v)</code>"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2268 content = function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2269 %>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2270 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2271 Returns the type of its only argument, coded as a string.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2272 The possible results of this function are
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2273 "<code>nil</code>" (a string, not the value <b>nil</b>),
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2274 "<code>number</code>",
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2275 "<code>string</code>",
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2276 "<code>binary</code>",
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2277 "<code>boolean</code>",
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2278 "<code>table</code>",
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2279 "<code>function</code>",
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2280 and "<code>java</code>".
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2281 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2282 <%
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2283 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2284 }
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2285 ["Luan.values"] = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2286 title = "<code>Luan.values (&middot;&middot;&middot;)</code>"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2287 content = function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2288 %>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2289 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2290 Returns a function so that the construction
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2291 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2292 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2293 for i, v in Luan.values(&middot;&middot;&middot;) do <em>body</em> end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2294 </pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2295
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2296 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2297 will iterate over all values of <code>&middot;&middot;&middot;</code>.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2298 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2299 <%
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2300 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2301 }
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2302 ["Luan.VERSION"] = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2303 title = "<code>Luan.VERSION</code>"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2304 content = function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2305 %>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2306 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2307 A global variable (not a function) that
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2308 holds a string containing the current Luan version.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2309 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2310 <%
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2311 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2312 }
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2313 }
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2314 }
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2315 package_lib = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2316 title = "Modules"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2317 content = function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2318 %>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2319 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2320 Include this library by:
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2321 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2322 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2323 local Package = require "luan:Package.luan"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2324 </pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2325
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2326 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2327 The package library provides basic
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2328 facilities for loading modules in Luan.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2329 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2330 <%
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2331 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2332 subs = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2333 ["Package.load"] = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2334 title = "<code>Package.load (mod_uri)</code>"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2335 content = function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2336 %>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2337 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2338 Loads the given module.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2339 The function starts by looking into the <a href="#Package.loaded"><code>Package.loaded</code></a> table
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2340 to determine whether <code>mod_uri</code> is already loaded.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2341 If it is, then <code>Package.load</code> returns the value stored
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2342 at <code>Package.loaded[mod_uri]</code>.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2343 Otherwise, it tries to load a new value for the module.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2344 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2345
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2346 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2347 To load a new value, <code>Package.load</code> first checks if <code>mod_uri</code> starts with "<b>java:</b>". If yes, then this is a Java class which is loaded by special Java code.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2348 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2349
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2350 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2351 Otherwise <code>Package.load</code> tries to read the text of the file referred to by <code>mod_uri</code>. If the file doesn't exist, then <code>Package.load</code> returns <b>false</b>. If the file exists, then its content is compiled into a chunk by calling <a href="#Luan.load"><code>Luan.load</code></a>. This chunk is run passing in <code>mod_uri</code> as an argument. The value returned by the chunk must not be <b>nil</b> and is loaded.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2352 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2353
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2354 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2355 If a new value for the module successful loaded, then it is stored in <code>Package.loaded[mod_uri]</code>. The value is returned.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2356 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2357 <%
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2358 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2359 }
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2360 ["Package.loaded"] = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2361 title = "<code>Package.loaded</code>"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2362 content = function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2363 %>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2364 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2365 A table used by <a href="#Package.load"><code>Package.load</code></a> to control which
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2366 modules are already loaded.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2367 When you load a module <code>mod_uri</code> and
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2368 <code>Package.loaded[mod_uri]</code> is not <b>nil</b>,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2369 <a href="#Package.load"><code>Package.load</code></a> simply returns the value stored there.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2370 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2371
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2372 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2373 This variable is only a reference to the real table;
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2374 assignments to this variable do not change the
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2375 table used by <a href="#Package.load"><code>Package.load</code></a>.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2376 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2377 <%
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2378 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2379 }
1656
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
2380 }
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
2381 }
1668
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2382 string_lib = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2383 title = "String Manipulation"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2384 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2385 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2386 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2387 Include this library by:
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2388 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2389 <pre>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2390 local String = require "luan:String.luan"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2391 </pre>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2392
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2393 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2394 This library provides generic functions for string manipulation,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2395 such as finding and extracting substrings, and pattern matching.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2396 When indexing a string in Luan, the first character is at position&nbsp;1
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2397 (not at&nbsp;0, as in Java).
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2398 Indices are allowed to be negative and are interpreted as indexing backwards,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2399 from the end of the string.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2400 Thus, the last character is at position -1, and so on.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2401 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2402 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2403 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2404 subs = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2405 ["String.char"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2406 title = "<code>String.char (&middot;&middot;&middot;)</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2407 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2408 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2409 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2410 Receives zero or more integers.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2411 Returns a string with length equal to the number of arguments,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2412 in which each character has the internal numerical code equal
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2413 to its corresponding argument.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2414 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2415 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2416 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2417 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2418 ["String.encode"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2419 title = "<code>String.encode (s)</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2420 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2421 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2422 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2423 Encodes argument <code>s</code> into a string that can be placed in quotes so as to return the original value of the string.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2424 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2425 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2426 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2427 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2428 ["String.find"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2429 title = "<code>String.find (s, pattern [, init [, plain]])</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2430 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2431 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2432 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2433 Looks for the first match of
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2434 <code>pattern</code> (see <a href="http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html">Pattern</a>) in the string <code>s</code>.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2435 If it finds a match, then <code>find</code> returns the indices of&nbsp;<code>s</code>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2436 where this occurrence starts and ends;
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2437 otherwise, it returns <b>nil</b>.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2438 A third, optional numerical argument <code>init</code> specifies
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2439 where to start the search;
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2440 its default value is&nbsp;1 and can be negative.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2441 A value of <b>true</b> as a fourth, optional argument <code>plain</code>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2442 turns off the pattern matching facilities,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2443 so the function does a plain "find substring" operation,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2444 with no characters in <code>pattern</code> being considered magic.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2445 Note that if <code>plain</code> is given, then <code>init</code> must be given as well.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2446 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2447
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2448 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2449 If the pattern has captures,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2450 then in a successful match
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2451 the captured values are also returned,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2452 after the two indices.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2453 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2454 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2455 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2456 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2457 ["String.format"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2458 title = "<code>String.format (formatstring, &middot;&middot;&middot;)</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2459 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2460 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2461 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2462 Returns a formatted version of its variable number of arguments
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2463 following the description given in its first argument (which must be a string).
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2464 The format string follows the same rules as the Java function <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#format(java.lang.String,%20java.lang.Object...)"><code>String.format</code></a> because Luan calls this internally.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2465 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2466
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2467 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2468 Note that Java's <code>String.format</code> is too stupid to convert between ints and floats, so you must provide the right kind of number.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2469 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2470 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2471 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2472 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2473 ["String.gmatch"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2474 title = "<code>String.gmatch (s, pattern)</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2475 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2476 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2477 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2478 Returns an iterator function that,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2479 each time it is called,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2480 returns the next captures from <code>pattern</code> (see <a href="http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html">Pattern</a>)
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2481 over the string <code>s</code>.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2482 If <code>pattern</code> specifies no captures,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2483 then the whole match is produced in each call.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2484 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2485
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2486 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2487 As an example, the following loop
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2488 will iterate over all the words from string <code>s</code>,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2489 printing one per line:
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2490 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2491 <pre>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2492 local s = "hello world from Lua"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2493 for w in String.gmatch(s, [[\w+]]) do
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2494 print(w)
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2495 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2496 </pre>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2497
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2498 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2499 The next example collects all pairs <code>key=value</code> from the
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2500 given string into a table:
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2501 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2502 <pre>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2503 local t = {}
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2504 local s = "from=world, to=Lua"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2505 for k, v in String.gmatch(s, [[(\w+)=(\w+)]]) do
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2506 t[k] = v
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2507 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2508 </pre>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2509
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2510 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2511 For this function, a caret '<code>^</code>' at the start of a pattern does not
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2512 work as an anchor, as this would prevent the iteration.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2513 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2514 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2515 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2516 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2517 ["String.gsub"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2518 title = "<code>String.gsub (s, pattern, repl [, n])</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2519 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2520 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2521 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2522 Returns a copy of <code>s</code>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2523 in which all (or the first <code>n</code>, if given)
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2524 occurrences of the <code>pattern</code> (see <a href="http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html">Pattern</a>) have been
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2525 replaced by a replacement string specified by <code>repl</code>,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2526 which can be a string, a table, or a function.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2527 <code>gsub</code> also returns, as its second value,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2528 the total number of matches that occurred.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2529 The name <code>gsub</code> comes from <em>Global SUBstitution</em>.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2530 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2531
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2532 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2533 If <code>repl</code> is a string, then its value is used for replacement.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2534 The character&nbsp;<code>\</code> works as an escape character.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2535 Any sequence in <code>repl</code> of the form <code>$<em>d</em></code>,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2536 with <em>d</em> between 1 and 9,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2537 stands for the value of the <em>d</em>-th captured substring.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2538 The sequence <code>$0</code> stands for the whole match.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2539 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2540
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2541 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2542 If <code>repl</code> is a table, then the table is queried for every match,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2543 using the first capture as the key.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2544 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2545
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2546 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2547 If <code>repl</code> is a function, then this function is called every time a
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2548 match occurs, with all captured substrings passed as arguments,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2549 in order.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2550 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2551
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2552 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2553 In any case,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2554 if the pattern specifies no captures,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2555 then it behaves as if the whole pattern was inside a capture.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2556 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2557
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2558 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2559 If the value returned by the table query or by the function call
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2560 is not <b>nil</b>,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2561 then it is used as the replacement string;
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2562 otherwise, if it is <b>nil</b>,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2563 then there is no replacement
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2564 (that is, the original match is kept in the string).
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2565 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2566
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2567 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2568 Here are some examples:
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2569 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2570 <pre>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2571 x = String.gsub("hello world", [[(\w+)]], "$1 $1")
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2572 --&gt; x="hello hello world world"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2573
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2574 x = String.gsub("hello world", [[\w+]], "$0 $0", 1)
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2575 --&gt; x="hello hello world"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2576
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2577 x = String.gsub("hello world from Luan", [[(\w+)\s*(\w+)]], "$2 $1")
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2578 --&gt; x="world hello Luan from"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2579
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2580 x = String.gsub("4+5 = $return 4+5$", [[\$(.*?)\$]], function (s)
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2581 return load(s)()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2582 end)
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2583 --&gt; x="4+5 = 9"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2584
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2585 local t = {name="lua", version="5.3"}
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2586 x = String.gsub("$name-$version.tar.gz", [[\$(\w+)]], t)
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2587 --&gt; x="lua-5.3.tar.gz"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2588 </pre>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2589 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2590 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2591 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2592 ["String.lower"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2593 title = "<code>String.lower (s)</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2594 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2595 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2596 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2597 Receives a string and returns a copy of this string with all
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2598 uppercase letters changed to lowercase.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2599 All other characters are left unchanged.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2600 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2601 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2602 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2603 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2604 ["String.match"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2605 title = "<code>String.match (s, pattern [, init])</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2606 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2607 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2608 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2609 Looks for the first <em>match</em> of
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2610 <code>pattern</code> (see <a href="http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html">Pattern</a>) in the string <code>s</code>.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2611 If it finds one, then <code>match</code> returns
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2612 the captures from the pattern;
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2613 otherwise it returns <b>nil</b>.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2614 If <code>pattern</code> specifies no captures,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2615 then the whole match is returned.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2616 A third, optional numerical argument <code>init</code> specifies
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2617 where to start the search;
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2618 its default value is&nbsp;1 and can be negative.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2619 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2620 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2621 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2622 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2623 ["String.matches"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2624 title = "<code>String.matches (s, pattern)</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2625 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2626 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2627 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2628 Returns a boolean indicating whether the <code>pattern</code> can be found in string <code>s</code>.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2629 This function is equivalent to
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2630 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2631 <pre>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2632 return String.match(s,pattern) ~= nil
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2633 </pre>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2634 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2635 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2636 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2637 ["String.regex_quote"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2638 title = "<code>String.regex_quote (s)</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2639 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2640 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2641 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2642 Returns a string which matches the literal string <code>s</code> in a regular expression. This function is simply the Java method <a href="http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html#quote(java.lang.String)"><code>Pattern.quote</code></a>.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2643 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2644 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2645 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2646 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2647 ["String.rep"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2648 title = "<code>String.rep (s, n [, sep])</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2649 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2650 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2651 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2652 Returns a string that is the concatenation of <code>n</code> copies of
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2653 the string <code>s</code> separated by the string <code>sep</code>.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2654 The default value for <code>sep</code> is the empty string
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2655 (that is, no separator).
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2656 Returns the empty string if <code>n</code> is not positive.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2657 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2658 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2659 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2660 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2661 ["String.reverse"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2662 title = "<code>String.reverse (s)</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2663 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2664 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2665 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2666 Returns a string that is the string <code>s</code> reversed.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2667 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2668 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2669 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2670 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2671 ["String.split"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2672 title = "<code>String.split (s, pattern [, limit])</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2673 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2674 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2675 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2676 Splits <code>s</code> using regex <code>pattern</code> and returns the results. If <code>limit</code> is positive, then only returns at most that many results. If <code>limit</code> is zero, then remove trailing empty results.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2677 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2678 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2679 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2680 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2681 ["String.sub"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2682 title = "<code>String.sub (s, i [, j])</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2683 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2684 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2685 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2686 Returns the substring of <code>s</code> that
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2687 starts at <code>i</code> and continues until <code>j</code>;
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2688 <code>i</code> and <code>j</code> can be negative.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2689 If <code>j</code> is absent, then it is assumed to be equal to -1
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2690 (which is the same as the string length).
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2691 In particular,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2692 the call <code>string.sub(s,1,j)</code> returns a prefix of <code>s</code>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2693 with length <code>j</code>,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2694 and <code>string.sub(s, -i)</code> returns a suffix of <code>s</code>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2695 with length <code>i</code>.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2696 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2697
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2698 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2699 If, after the translation of negative indices,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2700 <code>i</code> is less than 1,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2701 it is corrected to 1.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2702 If <code>j</code> is greater than the string length,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2703 it is corrected to that length.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2704 If, after these corrections,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2705 <code>i</code> is greater than <code>j</code>,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2706 the function returns the empty string.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2707 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2708 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2709 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2710 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2711 ["String.to_binary"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2712 title = "<code>String.to_binary (s)</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2713 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2714 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2715 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2716 Converts a string to a binary by calling the Java method <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#getBytes()"><code>String.getBytes</code></a>.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2717 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2718 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2719 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2720 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2721 ["String.to_number"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2722 title = "<code>String.to_number (s [, base])</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2723 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2724 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2725 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2726 When called with no <code>base</code>,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2727 <code>to_number</code> tries to convert its argument to a number.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2728 If the argument is
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2729 a string convertible to a number,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2730 then <code>to_number</code> returns this number;
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2731 otherwise, it returns <b>nil</b>.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2732 The conversion of strings can result in integers or floats.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2733 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2734
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2735 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2736 When called with <code>base</code>,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2737 then <code>s</code> must be a string to be interpreted as
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2738 an integer numeral in that base.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2739 In bases above&nbsp;10, the letter '<code>A</code>' (in either upper or lower case)
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2740 represents&nbsp;10, '<code>B</code>' represents&nbsp;11, and so forth,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2741 with '<code>Z</code>' representing 35.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2742 If the string <code>s</code> is not a valid numeral in the given base,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2743 the function returns <b>nil</b>.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2744 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2745 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2746 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2747 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2748 ["String.trim"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2749 title = "<code>String.trim (s)</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2750 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2751 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2752 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2753 Removes the leading and trailing whitespace by calling the Java method <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#trim()"><code>String.trim</code></a>.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2754 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2755 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2756 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2757 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2758 ["String.unicode"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2759 title = "<code>String.unicode (s [, i [, j]])</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2760 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2761 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2762 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2763 Returns the internal numerical codes of the characters <code>s[i]</code>,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2764 <code>s[i+1]</code>, ..., <code>s[j]</code>.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2765 The default value for <code>i</code> is&nbsp;1;
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2766 the default value for <code>j</code> is&nbsp;<code>i</code>.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2767 These indices are corrected
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2768 following the same rules of function <a href="#String.sub"><code>String.sub</code></a>.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2769 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2770 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2771 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2772 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2773 ["String.upper"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2774 title = "<code>String.upper (s)</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2775 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2776 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2777 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2778 Receives a string and returns a copy of this string with all
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2779 lowercase letters changed to uppercase.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2780 All other characters are left unchanged.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2781 The definition of what a lowercase letter is depends on the current locale.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2782 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2783 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2784 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2785 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2786 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2787 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2788 binary_lib = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2789 title = "Binary Manipulation"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2790 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2791 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2792 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2793 Include this library by:
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2794 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2795 <pre>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2796 local Binary = require "luan:Binary.luan"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2797 </pre>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2798 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2799 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2800 subs = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2801 ["Binary.binary"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2802 title = "<code>Binary.binary (&middot;&middot;&middot;)</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2803 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2804 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2805 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2806 Receives zero or more bytes (as integers).
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2807 Returns a binary with length equal to the number of arguments,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2808 in which each byte has the internal numerical code equal
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2809 to its corresponding argument.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2810 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2811 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2812 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2813 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2814 ["Binary.byte"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2815 title = "<code>Binary.byte (b [, i [, j]])</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2816 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2817 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2818 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2819 Returns the internal numerical codes of the bytes <code>b[i]</code>,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2820 <code>b[i+1]</code>, ..., <code>b[j]</code>.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2821 The default value for <code>i</code> is&nbsp;1;
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2822 the default value for <code>j</code> is&nbsp;<code>i</code>.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2823 These indices are corrected
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2824 following the same rules of function <a href="#String.sub"><code>String.sub</code></a>.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2825 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2826 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2827 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2828 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2829 ["Binary.to_string"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2830 title = "<code>Binary.to_string (b [,charset])</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2831 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2832 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2833 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2834 If <code>charset</code> is not nil then converts the binary <code>b</code> to a string using the Java <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#String(byte[],%20java.lang.String)">String constructor</a>, else makes each byte a char.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2835 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2836 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2837 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2838 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2839 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2840 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2841 table_lib = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2842 title = "Table Manipulation"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2843 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2844 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2845 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2846 Include this library by:
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2847 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2848 <pre>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2849 local Table = require "luan:Table.luan"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2850 </pre>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2851
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2852 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2853 This library provides generic functions for table manipulation.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2854 It provides all its functions inside the table <code>Table</code>.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2855 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2856 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2857 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2858 subs = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2859 ["Table.clear"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2860 title = "<code>Table.clear (tbl)</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2861 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2862 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2863 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2864 Clears the table.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2865 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2866 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2867 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2868 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2869 ["Table.concat"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2870 title = "<code>Table.concat (list [, sep [, i [, j]]])</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2871 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2872 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2873 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2874 Given a list,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2875 returns the string <code>list[i]..sep..list[i+1] &middot;&middot;&middot; sep..list[j]</code>.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2876 The default value for <code>sep</code> is the empty string,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2877 the default for <code>i</code> is 1,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2878 and the default for <code>j</code> is <code>#list</code>.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2879 If <code>i</code> is greater than <code>j</code>, returns the empty string.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2880 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2881 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2882 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2883 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2884 ["Table.copy"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2885 title = "<code>Table.copy (tbl [, i [, j]])</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2886 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2887 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2888 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2889 If <code>i</code> is <code>nil</code>, returns a shallow copy of <code>tbl</code>.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2890 Otherwise returns a new table which is a list of the elements <code>tbl[i] &middot;&middot;&middot; tbl[j]</code>.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2891 By default, <code>j</code> is <code>#tbl</code>.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2892 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2893 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2894 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2895 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2896 ["Table.insert"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2897 title = "<code>Table.insert (list, pos, value)</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2898 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2899 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2900 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2901 Inserts element <code>value</code> at position <code>pos</code> in <code>list</code>,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2902 shifting up the elements
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2903 <code>list[pos], list[pos+1], &middot;&middot;&middot;, list[#list]</code>.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2904 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2905 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2906 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2907 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2908 ["Table.is_empty"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2909 title = "<code>Table.is_empty (tbl)</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2910 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2911 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2912 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2913 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2914 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2915 ["Table.pack"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2916 title = "<code>Table.pack (&middot;&middot;&middot;)</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2917 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2918 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2919 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2920 Returns a new table with all parameters stored into keys 1, 2, etc.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2921 and with a field "<code>n</code>" with the total number of parameters.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2922 Note that the resulting table may not be a sequence.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2923 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2924 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2925 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2926 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2927 ["Table.remove"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2928 title = "<code>Table.remove (list, pos)</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2929 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2930 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2931 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2932 Removes from <code>list</code> the element at position <code>pos</code>,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2933 returning the value of the removed element.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2934 When <code>pos</code> is an integer between 1 and <code>#list</code>,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2935 it shifts down the elements
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2936 <code>list[pos+1], list[pos+2], &middot;&middot;&middot;, list[#list]</code>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2937 and erases element <code>list[#list]</code>;
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2938 The index <code>pos</code> can also be 0 when <code>#list</code> is 0,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2939 or <code>#list + 1</code>;
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2940 in those cases, the function erases the element <code>list[pos]</code>.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2941 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2942 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2943 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2944 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2945 ["Table.size"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2946 title = "<code>Table.size (tbl)</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2947 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2948 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2949 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2950 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2951 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2952 ["Table.sort"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2953 title = "<code>Table.sort (list [, comp])</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2954 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2955 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2956 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2957 Sorts list elements in a given order, <em>in-place</em>,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2958 from <code>list[1]</code> to <code>list[#list]</code>.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2959 If <code>comp</code> is given,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2960 then it must be a function that receives two list elements
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2961 and returns true when the first element must come
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2962 before the second in the final order
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2963 (so that <code>not comp(list[i+1],list[i])</code> will be true after the sort).
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2964 If <code>comp</code> is not given,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2965 then the standard Lua operator <code>&lt;</code> is used instead.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2966 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2967
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2968 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2969 The sort algorithm is not stable;
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2970 that is, elements considered equal by the given order
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2971 may have their relative positions changed by the sort.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2972 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2973 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2974 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2975 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2976 ["Table.unpack"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2977 title = "<code>Table.unpack (list [, i [, j]])</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2978 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2979 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2980 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2981 Returns the elements from the given list.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2982 This function is equivalent to
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2983 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2984 <pre>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2985 return list[i], list[i+1], &middot;&middot;&middot;, list[j]
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2986 </pre>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2987
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2988 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2989 By default, <code>i</code> is 1 and <code>j</code> is <code>list.n or #list</code>.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2990 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2991 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2992 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2993 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2994 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2995 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2996 number_lib = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2997 title = "Number Manipulation"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2998 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2999 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3000 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3001 Include this library by:
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3002 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3003 <pre>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3004 local Number = require "luan:Number.luan"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3005 </pre>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3006 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3007 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3008 subs = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3009 ["Number.double"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3010 title = "<code>Number.double (x)</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3011 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3012 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3013 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3014 Returns <code>x</code> as a double.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3015 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3016 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3017 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3018 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3019 ["Number.float"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3020 title = "<code>Number.float (x)</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3021 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3022 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3023 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3024 Returns <code>x</code> as a float.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3025 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3026 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3027 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3028 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3029 ["Number.integer"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3030 title = "<code>Number.integer (x)</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3031 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3032 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3033 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3034 If the value <code>x</code> is convertible to an integer,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3035 returns that integer.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3036 Otherwise throws an error.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3037 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3038 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3039 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3040 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3041 ["Number.long"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3042 title = "<code>Number.long (x)</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3043 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3044 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3045 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3046 If the value <code>x</code> is convertible to an long,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3047 returns that long.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3048 Otherwise throws an error.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3049 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3050 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3051 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3052 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3053 ["Number.long_to_string"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3054 title = "<code>Number.long_to_string (i, radix)</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3055 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3056 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3057 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3058 Converts long value <code>i</code> to a string by calling <code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Long.html#toString(long,%20int)">Long.toString</a></code>.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3059 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3060 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3061 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3062 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3063 ["Number.type"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3064 title = "<code>Number.type (x)</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3065 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3066 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3067 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3068 Returns a string for the numeric type of <code>x</code>. Possible return values include "<code>integer</code>", "<code>long</code>", "<code>double</code>", and "<code>float</code>".
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3069 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3070 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3071 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3072 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3073 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3074 }
1669
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3075 math_lib = {
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3076 title = "Mathematical Functions"
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3077 content = function()
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3078 %>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3079 <p>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3080 Include this library by:
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3081 </p>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3082 <pre>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3083 local Math = require "luan:Math.luan"
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3084 </pre>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3085
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3086 <p>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3087 This library provides basic mathematical functions.
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3088 It provides all its functions and constants inside the table <code>Math</code>.
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3089 </p>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3090 <%
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3091 end
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3092 subs = {
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3093 ["Math.abs"] = {
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3094 title = "<code>Math.abs (x)</code>"
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3095 content = function()
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3096 %>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3097 <p>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3098 Returns the absolute value of <code>x</code>.
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3099 </p>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3100 <%
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3101 end
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3102 }
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3103 ["Math.acos"] = {
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3104 title = "<code>Math.acos (x)</code>"
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3105 content = function()
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3106 %>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3107 <p>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3108 Returns the arc cosine of <code>x</code> (in radians).
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3109 </p>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3110 <%
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3111 end
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3112 }
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3113 ["Math.asin"] = {
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3114 title = "<code>Math.asin (x)</code>"
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3115 content = function()
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3116 %>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3117 <p>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3118 Returns the arc sine of <code>x</code> (in radians).
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3119 </p>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3120 <%
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3121 end
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3122 }
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3123 ["Math.atan"] = {
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3124 title = "<code>Math.atan (y, x)</code>"
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3125 content = function()
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3126 %>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3127 <p>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3128 Returns the arc tangent of <code>y/x</code> (in radians),
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3129 but uses the signs of both parameters to find the
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3130 quadrant of the result.
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3131 (It also handles correctly the case of <code>x</code> being zero.)
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3132 </p>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3133 <%
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3134 end
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3135 }
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3136 ["Math.ceil"] = {
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3137 title = "<code>Math.ceil (x)</code>"
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3138 content = function()
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3139 %>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3140 <p>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3141 Returns the smallest integral value larger than or equal to <code>x</code>.
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3142 </p>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3143 <%
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3144 end
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3145 }
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3146 ["Math.cos"] = {
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3147 title = "<code>Math.cos (x)</code>"
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3148 content = function()
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3149 %>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3150 <p>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3151 Returns the cosine of <code>x</code> (assumed to be in radians).
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3152 </p>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3153 <%
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3154 end
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3155 }
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3156 ["Math.deg"] = {
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3157 title = "<code>Math.deg (x)</code>"
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3158 content = function()
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3159 %>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3160 <p>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3161 Converts the angle <code>x</code> from radians to degrees.
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3162 </p>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3163 <%
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3164 end
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3165 }
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3166 ["Math.exp"] = {
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3167 title = "<code>Math.exp (x)</code>"
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3168 content = function()
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3169 %>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3170 <p>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3171 Returns the value <em>e<sup>x</sup></em>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3172 (where <code>e</code> is the base of natural logarithms).
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3173 </p>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3174 <%
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3175 end
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3176 }
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3177 ["Math.floor"] = {
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3178 title = "<code>Math.floor (x)</code>"
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3179 content = function()
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3180 %>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3181 <p>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3182 Returns the largest integral value smaller than or equal to <code>x</code>.
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3183 </p>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3184 <%
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3185 end
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3186 }
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3187 ["Math.fmod"] = {
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3188 title = "<code>Math.fmod (x, y)</code>"
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3189 content = function()
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3190 %>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3191 <p>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3192 Returns the remainder of the division of <code>x</code> by <code>y</code>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3193 that rounds the quotient towards zero.
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3194 </p>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3195 <%
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3196 end
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3197 }
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3198 ["Math.huge"] = {
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3199 title = "<code>Math.huge</code>"
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3200 content = function()
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3201 %>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3202 <p>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3203 A value larger than any other numerical value.
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3204 </p>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3205 <%
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3206 end
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3207 }
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3208 ["Math.log"] = {
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3209 title = "<code>Math.log (x [, base])</code>"
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3210 content = function()
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3211 %>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3212 <p>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3213 Returns the logarithm of <code>x</code> in the given base.
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3214 The default for <code>base</code> is <em>e</em>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3215 (so that the function returns the natural logarithm of <code>x</code>).
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3216 </p>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3217 <%
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3218 end
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3219 }
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3220 ["Math.max"] = {
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3221 title = "<code>Math.max (x, &middot;&middot;&middot;)</code>"
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3222 content = function()
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3223 %>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3224 <p>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3225 Returns the argument with the maximum value,
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3226 according to the Lua operator <code>&lt;</code>.
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3227 </p>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3228 <%
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3229 end
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3230 }
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3231 ["Math.max_integer"] = {
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3232 title = "<code>Math.max_integer</code>"
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3233 content = function()
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3234 %>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3235 <p>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3236 An integer with the maximum value for an integer.
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3237 </p>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3238 <%
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3239 end
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3240 }
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3241 ["Math.min"] = {
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3242 title = "<code>Math.min (x, &middot;&middot;&middot;)</code>"
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3243 content = function()
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3244 %>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3245 <p>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3246 Returns the argument with the minimum value,
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3247 according to the Lua operator <code>&lt;</code>.
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3248 </p>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3249 <%
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3250 end
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3251 }
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3252 ["Math.min_integer"] = {
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3253 title = "<code>Math.min_integer</code>"
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3254 content = function()
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3255 %>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3256 <p>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3257 An integer with the minimum value for an integer.
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3258 </p>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3259 <%
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3260 end
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3261 }
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3262 ["Math.modf"] = {
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3263 title = "<code>Math.modf (x)</code>"
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3264 content = function()
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3265 %>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3266 <p>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3267 Returns the integral part of <code>x</code> and the fractional part of <code>x</code>.
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3268 </p>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3269 <%
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3270 end
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3271 }
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3272 ["Math.pi"] = {
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3273 title = "<code>Math.pi</code>"
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3274 content = function()
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3275 %>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3276 <p>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3277 The value of <em>&pi;</em>.
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3278 </p>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3279 <%
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3280 end
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3281 }
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3282 ["Math.rad"] = {
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3283 title = "<code>Math.rad (x)</code>"
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3284 content = function()
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3285 %>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3286 <p>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3287 Converts the angle <code>x</code> from degrees to radians.
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3288 </p>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3289 <%
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3290 end
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3291 }
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3292 ["Math.random"] = {
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3293 title = "<code>Math.random ([m [, n])</code>"
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3294 content = function()
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3295 %>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3296 <p>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3297 When called without arguments,
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3298 returns a pseudo-random float with uniform distribution
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3299 in the range <em>[0,1)</em>.
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3300 When called with two integers <code>m</code> and <code>n</code>,
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3301 <code>Math.random</code> returns a pseudo-random integer
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3302 with uniform distribution in the range <em>[m, n]</em>.
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3303 (The value <em>m-n</em> cannot be negative and must fit in a Luan integer.)
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3304 The call <code>Math.random(n)</code> is equivalent to <code>Math.random(1,n)</code>.
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3305 </p>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3306
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3307 <p>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3308 This function is an interface to the underling
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3309 pseudo-random generator function provided by Java.
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3310 No guarantees can be given for its statistical properties.
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3311 </p>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3312 <%
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3313 end
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3314 }
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3315 ["Math.sin"] = {
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3316 title = "<code>Math.sin (x)</code>"
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3317 content = function()
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3318 %>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3319 <p>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3320 Returns the sine of <code>x</code> (assumed to be in radians).
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3321 </p>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3322 <%
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3323 end
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3324 }
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3325 ["Math.sqrt"] = {
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3326 title = "<code>Math.sqrt (x)</code>"
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3327 content = function()
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3328 %>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3329 <p>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3330 Returns the square root of <code>x</code>.
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3331 (You can also use the expression <code>x^0.5</code> to compute this value.)
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3332 </p>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3333 <%
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3334 end
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3335 }
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3336 ["Math.tan"] = {
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3337 title = "<code>Math.tan (x)</code>"
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3338 content = function()
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3339 %>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3340 <p>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3341 Returns the tangent of <code>x</code> (assumed to be in radians).
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3342 </p>
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3343 <%
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3344 end
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3345 }
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3346 }
fdeb1879fe02 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1668
diff changeset
3347 }
1656
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3348 }
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3349 }
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3350 }
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3351
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3352
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3353 return function()
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3354 Io.stdout = Http.response.text_writer()
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3355 %>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3356 <!doctype html>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3357 <html>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3358 <head>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3359 <% head() %>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3360 <title>Luan Reference Manual</title>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3361 <style>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3362 p[keywords] {
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3363 font-family: monospace;
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3364 margin-left: 40px;
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3365 max-width: 700px;
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3366 }
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3367 p[keywords] span {
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3368 display: inline-block;
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3369 width: 100px;
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3370 }
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3371 </style>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3372 </head>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3373 <body>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3374 <% docs_header() %>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3375 <div content>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3376 <h1><a href="manual.html">Luan Reference Manual</a></h1>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3377 <p small>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3378 Original copyright &copy; 2015 Lua.org, PUC-Rio.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3379 Freely available under the terms of the
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3380 <a href="http://www.lua.org/license.html">Lua license</a>.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3381 Modified for Luan.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3382 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3383 <hr>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3384 <h2>Contents</h2>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3385 <div toc>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3386 <% show_toc(content) %>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3387 </div>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3388 <hr>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3389 <% show_content(content,2) %>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3390 </div>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3391 </body>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3392 </html>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3393 <%
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3394 end