annotate website/src/m.html.luan @ 1668:ef75d9ad5ce9

manual work
author Franklin Schmidt <fschmidt@gmail.com>
date Mon, 09 May 2022 23:30:25 -0600
parents c55373c3a0ce
children fdeb1879fe02
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>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
295 <b>"mod": </b>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
296 the <code>%</code> operation.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
297 Behavior similar to the "add" operation.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
298 </p></li>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
299
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
300 <li><p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
301 <b>"pow": </b>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
302 the <code>^</code> (exponentiation) 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>"unm": </b>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
308 the <code>-</code> (unary minus) 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>"concat": </b>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
314 the <code>..</code> (concatenation) 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>"len": </b>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
320 the <code>#</code> (length) operation.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
321 If there is a metamethod,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
322 Luan calls it with the object as argument,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
323 and the result of the call
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
324 (always adjusted to one value)
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
325 is the result of the operation.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
326 If there is no metamethod but the object is a table,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
327 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
328 Otherwise, Luan raises an error.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
329 </p></li>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
330
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
331 <li><p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
332 <b>"eq": </b>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
333 the <code>==</code> (equal) operation.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
334 Behavior similar to the "add" operation,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
335 except that Luan will try a metamethod only when the values
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
336 being compared are both tables
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
337 and they are not primitively equal.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
338 The result of the call is always converted to a boolean.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
339 </p></li>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
340
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
341 <li><p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
342 <b>"lt": </b>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
343 the <code>&lt;</code> (less than) operation.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
344 Behavior similar to the "add" operation.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
345 The result of the call is always converted to a boolean.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
346 </p></li>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
347
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
348 <li><p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
349 <b>"le": </b>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
350 the <code>&lt;=</code> (less equal) operation.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
351 Unlike other operations,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
352 The less-equal operation can use two different events.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
353 First, Luan looks for the "<code>__le</code>" metamethod in both operands,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
354 like in the "lt" operation.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
355 If it cannot find such a metamethod,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
356 then it will try the "<code>__lt</code>" event,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
357 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
358 As with the other comparison operators,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
359 the result is always a boolean.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
360 </p></li>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
361
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
362 <li>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
363 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
364 <b>"index": </b>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
365 The indexing access <code>table[key]</code>.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
366 This event happens
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
367 when <code>key</code> is not present in <code>table</code>.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
368 The metamethod is looked up in <code>table</code>.
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
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
371 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
372 Despite the name,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
373 the metamethod for this event can be any type.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
374 If it is a function,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
375 it is called with <code>table</code> and <code>key</code> as arguments.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
376 Otherwise
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
377 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
378 (This indexing is regular, not raw,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
379 and therefore can trigger another metamethod if the metamethod object is a table.)
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
380 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
381 </li>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
382
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
383 <li>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
384 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
385 <b>"new_index": </b>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
386 The indexing assignment <code>table[key] = value</code>.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
387 Like the index event,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
388 this event happens when
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
389 when <code>key</code> is not present in <code>table</code>.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
390 The metamethod is looked up in <code>table</code>.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
391 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
392
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
393 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
394 Like with indexing,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
395 the metamethod for this event can be either a function or a table.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
396 If it is a function,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
397 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
398 If it is a table,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
399 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
400 (This assignment is regular, not raw,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
401 and therefore can trigger another metamethod.)
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
402 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
403
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
404 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
405 Whenever there is a "new_index" metamethod,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
406 Luan does not perform the primitive assignment.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
407 (If necessary,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
408 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
409 to do the assignment.)
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 </li>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
412
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
413 <li><p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
414 <b>"gc":</b>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
415 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
416 </p></li>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
417
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
418 </ul>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
419 <%
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
420 end
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
421 }
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
422 gc = {
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
423 title = "Garbage Collection"
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
424 content = function()
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
425 %>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
426 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
427 Luan uses Java's garbage collection.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
428 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
429 <%
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
430 end
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
431 }
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
432 }
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
433 }
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
434 lang = {
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
435 title = "The Language"
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
436 content = function()
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
437 %>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
438 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
439 This section describes the lexis, the syntax, and the semantics of Luan.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
440 In other words,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
441 this section describes
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
442 which tokens are valid,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
443 how they can be combined,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
444 and what their combinations mean.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
445 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
446
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
447 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
448 Language constructs will be explained using the usual extended BNF notation,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
449 in which
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
450 {<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
451 [<em>a</em>]&nbsp;means an optional <em>a</em>.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
452 Non-terminals are shown like non-terminal,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
453 keywords are shown like <b>kword</b>,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
454 and other terminal symbols are shown like &lsquo;<b>=</b>&rsquo;.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
455 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
456 at the end of this manual.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
457 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
458 <%
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
459 end
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
460 subs = {
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
461 lex = {
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
462 title = "Lexical Conventions"
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
463 content = function()
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
464 %>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
465 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
466 Luan ignores spaces and comments
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
467 between lexical elements (tokens),
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
468 except as delimiters between names and keywords.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
469 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
470 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
471
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
472 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
473 <em>Names</em>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
474 (also called <em>identifiers</em>)
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
475 in Luan can be any string of letters,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
476 digits, and underscores,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
477 not beginning with a digit.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
478 Identifiers are used to name variables, table fields, and labels.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
479 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
480
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
481 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
482 The following <em>keywords</em> are reserved
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
483 and cannot be used as names:
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
484 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
485
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
486 <p keywords>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
487 <span>and</span>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
488 <span>break</span>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
489 <span>catch</span>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
490 <span>continue</span>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
491 <span>do</span>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
492 <span>else</span>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
493 <span>elseif</span>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
494 <span>end_do</span>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
495 <span>end_for</span>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
496 <span>end_function</span>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
497 <span>end_if</span>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
498 <span>end_try</span>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
499 <span>end_while</span>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
500 <span>false</span>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
501 <span>finally</span>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
502 <span>for</span>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
503 <span>function</span>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
504 <span>if</span>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
505 <span>in</span>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
506 <span>local</span>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
507 <span>nil</span>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
508 <span>not</span>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
509 <span>or</span>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
510 <span>repeat</span>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
511 <span>return</span>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
512 <span>then</span>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
513 <span>true</span>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
514 <span>try</span>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
515 <span>until</span>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
516 <span>while</span>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
517 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
518
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
519 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
520 Luan is a case-sensitive language:
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
521 <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
522 are two different, valid names.
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 The following strings denote other tokens:
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
527 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
528
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
529 <pre>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
530 + - * / % ^ #
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
531 &amp; ~ | &lt;&lt; &gt;&gt; //
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
532 == ~= &lt;= &gt;= &lt; &gt; =
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
533 ( ) { } [ ] ::
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 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
538 <em>Literal strings</em>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
539 can be delimited by matching single or double quotes,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
540 and can contain the following C-like escape sequences:
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
541 '<code>\a</code>' (bell),
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
542 '<code>\b</code>' (backspace),
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
543 '<code>\f</code>' (form feed),
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
544 '<code>\n</code>' (newline),
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
545 '<code>\r</code>' (carriage return),
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
546 '<code>\t</code>' (horizontal tab),
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
547 '<code>\v</code>' (vertical tab),
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
548 '<code>\\</code>' (backslash),
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
549 '<code>\"</code>' (quotation mark [double quote]),
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
550 and '<code>\'</code>' (apostrophe [single quote]).
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
551 A backslash followed by a real newline
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
552 results in a newline in the string.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
553 The escape sequence '<code>\z</code>' skips the following span
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
554 of white-space characters,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
555 including line breaks;
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
556 it is particularly useful to break and indent a long literal string
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
557 into multiple lines without adding the newlines and spaces
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
558 into the string contents.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
559 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
560
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
561 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
562 Luan can specify any character in a literal string by its numerical value.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
563 This can be done
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
564 with the escape sequence <code>\x<em>XX</em></code>,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
565 where <em>XX</em> is a sequence of exactly two hexadecimal digits,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
566 or with the escape sequence <code>\u<em>XXXX</em></code>,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
567 where <em>XXXX</em> is a sequence of exactly four hexadecimal digits,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
568 or with the escape sequence <code>\<em>ddd</em></code>,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
569 where <em>ddd</em> is a sequence of up to three decimal digits.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
570 (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
571 it must be expressed using exactly three digits.)
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
572 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
573
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
574 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
575 Literal strings can also be defined using a long format
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
576 enclosed by <em>long brackets</em>.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
577 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
578 square bracket followed by <em>n</em> equal signs followed by another
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
579 opening square bracket.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
580 So, an opening long bracket of level 0 is written as <code>[[</code>,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
581 an opening long bracket of level 1 is written as <code>[=[</code>,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
582 and so on.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
583 A <em>closing long bracket</em> is defined similarly;
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
584 for instance,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
585 a closing long bracket of level 4 is written as <code>]====]</code>.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
586 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
587 ends at the first closing long bracket of the same level.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
588 It can contain any text except a closing bracket of the same level.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
589 Literals in this bracketed form can run for several lines,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
590 do not interpret any escape sequences,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
591 and ignore long brackets of any other level.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
592 Any kind of end-of-line sequence
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
593 (carriage return, newline, carriage return followed by newline,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
594 or newline followed by carriage return)
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
595 is converted to a simple newline.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
596 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
597
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
598 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
599 Any character in a literal string not
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
600 explicitly affected by the previous rules represents itself.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
601 However, Luan opens files for parsing in text mode,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
602 and the system file functions may have problems with
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
603 some control characters.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
604 So, it is safer to represent
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
605 non-text data as a quoted literal with
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
606 explicit escape sequences for non-text characters.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
607 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
608
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
609 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
610 For convenience,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
611 when the opening long bracket is immediately followed by a newline,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
612 the newline is not included in the string.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
613 As an example
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
614 the five literal strings below denote the same string:
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
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
617 <pre>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
618 a = 'alo\n123"'
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
619 a = "alo\n123\""
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
620 a = '\97lo\10\04923"'
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
621 a = [[alo
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
622 123"]]
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
623 a = [==[
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
624 alo
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
625 123"]==]
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
626 </pre>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
627
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
628 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
629 A <em>numerical constant</em> (or <em>numeral</em>)
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
630 can be written with an optional fractional part
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
631 and an optional decimal exponent,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
632 marked by a letter '<code>e</code>' or '<code>E</code>'.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
633 Luan also accepts hexadecimal constants,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
634 which start with <code>0x</code> or <code>0X</code>.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
635 Hexadecimal constants also accept an optional fractional part
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
636 plus an optional binary exponent,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
637 marked by a letter '<code>p</code>' or '<code>P</code>'.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
638 A numeric constant with a fractional dot or an exponent
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
639 denotes a float;
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
640 otherwise it denotes an integer.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
641 Examples of valid integer constants are
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
642 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
643
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
644 <pre>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
645 3 345 0xff 0xBEBADA
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
646 </pre>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
647
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 Examples of valid float constants are
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
650 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
651
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 3.0 3.1416 314.16e-2 0.31416E1 34e1
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
654 0x0.1E 0xA23p-4 0X1.921FB54442D18P+1
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
655 </pre>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
656
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
657 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
658 A <em>comment</em> starts with a double hyphen (<code>--</code>)
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
659 anywhere outside a string.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
660 If the text immediately after <code>--</code> is not an opening long bracket,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
661 the comment is a <em>short comment</em>,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
662 which runs until the end of the line.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
663 Otherwise, it is a <em>long comment</em>,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
664 which runs until the corresponding closing long bracket.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
665 Long comments are frequently used to disable code temporarily.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
666 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
667 <%
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
668 end
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
669 }
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
670 vars = {
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
671 title = "Variables"
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
672 content = function()
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
673 %>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
674 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
675 Variables are places that store values.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
676 There are three kinds of variables in Luan:
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
677 global variables, local variables, and table fields.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
678 </p>
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 A single name can denote a global variable or a local variable
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
682 (or a function's formal parameter,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
683 which is a particular kind of local variable):
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 <pre>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
687 var ::= Name
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
688 </pre>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
689
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 Name denotes identifiers, as defined in <a href="#lex">Lexical Conventions</a>.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
692 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
693
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
694 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
695 Local variables are <em>lexically scoped</em>:
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
696 local variables can be freely accessed by functions
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
697 defined inside their scope (see <a href="#visibility">Visibility Rules</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 Before the first assignment to a variable, its value is <b>nil</b>.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
702 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
703
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 Square brackets are used to index a table:
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
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
708 <pre>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
709 var ::= prefixexp &lsquo;<b>[</b>&rsquo; exp &lsquo;<b>]</b>&rsquo;
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
710 </pre>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
711
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 The meaning of accesses to table fields can be changed via metatables.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
714 An access to an indexed variable <code>t[i]</code> is equivalent to
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
715 a call <code>gettable_event(t,i)</code>.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
716 (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
717 <code>gettable_event</code> function.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
718 This function is not defined or callable in Luan.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
719 We use it here only for explanatory purposes.)
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
720 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
721
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
722 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
723 The syntax <code>var.Name</code> is just syntactic sugar for
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
724 <code>var["Name"]</code>:
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
725 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
726
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
727 <pre>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
728 var ::= prefixexp &lsquo;<b>.</b>&rsquo; Name
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
729 </pre>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
730
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 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
733 is equivalent to <code>_ENV.x</code>.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
734 Due to the way that chunks are compiled,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
735 <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
736 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
737 <%
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
738 end
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
739 }
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
740 stmt = {
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
741 title = "Statements"
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
742 content = function()
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
743 %>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
744 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
745 Luan supports an almost conventional set of statements,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
746 similar to those in Pascal or C.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
747 This set includes
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
748 assignments, control structures, function calls,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
749 and variable declarations.
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 <%
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
752 end
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
753 subs = {
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
754 blocks = {
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
755 title = "Blocks"
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
756 content = function()
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
757 %>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
758 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
759 A block is a list of statements,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
760 which are executed sequentially:
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
761 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
762
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
763 <pre>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
764 block ::= {stat}
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
765 </pre>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
766
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 Luan has <em>empty statements</em>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
769 that allow you to separate statements with semicolons,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
770 start a block with a semicolon
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
771 or write two semicolons in sequence:
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
772 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
773
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
774 <pre>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
775 stat ::= &lsquo;<b>;</b>&rsquo;
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
776 </pre>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
777
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 A block can be explicitly delimited to produce a single statement:
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
780 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
781
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 stat ::= <b>do</b> block end_do
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
784 end_do ::= <b>end_do</b> | <b>end</b>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
785 </pre>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
786
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
787 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
788 Explicit blocks are useful
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
789 to control the scope of variable declarations.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
790 Explicit blocks are also sometimes used to
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
791 add a <b>return</b> statement in the middle
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
792 of another block (see <a href="#control">Control Structures</a>).
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 <%
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
795 end
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
796 }
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
797 chunks = {
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
798 title = "Chunks"
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
799 content = function()
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
800 %>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
801 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
802 The unit of compilation of Luan is called a <em>chunk</em>.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
803 Syntactically,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
804 a chunk is simply a block:
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
805 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
806
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
807 <pre>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
808 chunk ::= block
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
809 </pre>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
810
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 Luan handles a chunk as the body of an anonymous function
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
813 with a variable number of arguments
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
814 (see <a href="#fn_def">Function Definitions</a>).
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
815 As such, chunks can define local variables,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
816 receive arguments, and return values.
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
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
819 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
820 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
821 To execute a chunk,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
822 Luan first <em>loads</em> it,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
823 compiling the chunk's code,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
824 and then Luan executes the compiled code.
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 <%
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
827 end
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
828 }
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
829 assignment = {
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
830 title = "Assignment"
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
831 content = function()
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
832 %>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
833 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
834 Luan allows multiple assignments.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
835 Therefore, the syntax for assignment
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
836 defines a list of variables on the left side
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
837 and a list of expressions on the right side.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
838 The elements in both lists are separated by commas:
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
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
841 <pre>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
842 stat ::= varlist &lsquo;<b>=</b>&rsquo; explist
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
843 varlist ::= var {&lsquo;<b>,</b>&rsquo; var}
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
844 explist ::= exp {&lsquo;<b>,</b>&rsquo; exp}
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
845 </pre>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
846
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
847 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
848 Expressions are discussed in <a href="#expressions">Expressions</a>.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
849 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
850
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
851 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
852 Before the assignment,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
853 the list of values is <em>adjusted</em> to the length of
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
854 the list of variables.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
855 If there are more values than needed,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
856 the excess values are thrown away.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
857 If there are fewer values than needed,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
858 the list is extended with as many <b>nil</b>'s as needed.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
859 If the list of expressions ends with a function call,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
860 then all values returned by that call enter the list of values,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
861 before the adjustment
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
862 (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
863 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
864
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
865 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
866 The assignment statement first evaluates all its expressions
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
867 and only then the assignments are performed.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
868 Thus the code
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 <pre>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
872 i = 3
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
873 i, a[i] = i+1, 20
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
874 </pre>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
875
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
876 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
877 sets <code>a[3]</code> to 20, without affecting <code>a[4]</code>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
878 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
879 before it is assigned&nbsp;4.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
880 Similarly, the line
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
881 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
882
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
883 <pre>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
884 x, y = y, x
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
885 </pre>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
886
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 exchanges the values of <code>x</code> and <code>y</code>,
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
889 and
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
890 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
891
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
892 <pre>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
893 x, y, z = y, z, x
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
894 </pre>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
895
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 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
898 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
899
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
900 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
901 The meaning of assignments to global variables
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
902 and table fields can be changed via metatables.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
903 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
904 <code>settable_event(t,i,val)</code>.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
905 (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
906 <code>settable_event</code> function.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
907 This function is not defined or callable in Luan.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
908 We use it here only for explanatory purposes.)
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
909 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
910
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
911 <p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
912 An assignment to a global name <code>x = val</code>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
913 is equivalent to the assignment
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
914 <code>_ENV.x = val</code> (see <a href="#env">Environments</a>).
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
915 Global names are only available when <code>_ENV</code> is defined.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
916 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
917 <%
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
918 end
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
919 }
1660
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
920 control = {
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
921 title = "Control Structures"
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
922 content = function()
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
923 %>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
924 <p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
925 The control structures
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
926 <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
927 familiar syntax:
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
928 </p>
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 <pre>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
931 stat ::= <b>while</b> exp <b>do</b> block end_while
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
932 stat ::= <b>repeat</b> block <b>until</b> exp
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
933 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
934 end_while ::= <b>end_while</b> | <b>end</b>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
935 end_if ::= <b>end_if</b> | <b>end</b>
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
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
938 <p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
939 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
940 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
941
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
942 <p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
943 The condition expression of a
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
944 control structure must be a boolean.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
945 Any other value type will produce an error.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
946 This helps catch errors and makes code more readable.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
947 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
948
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
949 <p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
950 In the <b>repeat</b>&ndash;<b>until</b> loop,
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
951 the inner block does not end at the <b>until</b> keyword,
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
952 but only after the condition.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
953 So, the condition can refer to local variables
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
954 declared inside the loop block.
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
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
957 <p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
958 The <b>break</b> statement terminates the execution of a
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
959 <b>while</b>, <b>repeat</b>, or <b>for</b> loop,
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
960 skipping to the next statement after the loop:
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 <pre>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
964 stat ::= <b>break</b>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
965 </pre>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
966
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 A <b>break</b> ends the innermost enclosing loop.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
969 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
970
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
971 <p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
972 The <b>continue</b> statement jumps to the beginning of a
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
973 <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
974 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
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 <pre>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
978 stat ::= <b>continue</b>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
979 </pre>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
980
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 The <b>return</b> statement is used to return values
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
983 from a function or a chunk
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
984 (which is an anonymous function).
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
985 Functions can return more than one value,
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
986 so the syntax for the <b>return</b> statement is
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
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
989 <pre>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
990 stat ::= <b>return</b> [explist] [&lsquo;<b>;</b>&rsquo;]
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
991 </pre>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
992 <%
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
993 end
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 ["for"] = {
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
996 title = "For Statement"
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
997 content = function()
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 <p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1000 The <b>for</b> statement works over functions,
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1001 called <em>iterators</em>.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1002 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
1003 stopping when this new value is <b>nil</b>.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1004 The <b>for</b> loop has the following syntax:
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
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1007 <pre>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1008 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
1009 namelist ::= Name {&lsquo;<b>,</b>&rsquo; Name}
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1010 end_for ::= <b>end_for</b> | <b>end</b>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1011 </pre>
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 <p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1014 A <b>for</b> statement like
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1015 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1016
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 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
1019 </pre>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1020
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 is equivalent to the code:
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1023 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1024
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 do
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1027 local <em>f</em> = <em>exp</em>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1028 while true do
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1029 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
1030 if <em>var_1</em> == nil then break end
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1031 <em>block</em>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1032 end
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1033 end
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1034 </pre>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1035
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1036 <p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1037 Note the following:
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1038 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1039
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1040 <ul>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1041 <li>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1042 <code><em>exp</em></code> is evaluated only once.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1043 Its result is an <em>iterator</em> function.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1044 </li>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1045 <li>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1046 <code><em>f</em></code> is an invisible variable.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1047 The name is here for explanatory purposes only.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1048 </li>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1049 <li>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1050 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
1051 </li>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1052 <li>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1053 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
1054 you cannot use their values after the <b>for</b> ends.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1055 If you need these values,
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1056 then assign them to other variables before breaking or exiting the 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 </ul>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1059 <%
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1060 end
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1061 }
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1062 ["try"] = {
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1063 title = "Try Statement"
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1064 content = function()
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 <p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1067 The <b>try</b> statement has the same semantics as in Java.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1068 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1069
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1070 <pre>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1071 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
1072 end_try ::= <b>end_try</b> | <b>end</b>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1073 </pre>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1074 <%
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1075 end
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1076 }
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1077 fn_stmt = {
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1078 title = "Function Calls as Statements"
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1079 content = function()
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 <p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1082 To allow possible side-effects,
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1083 function calls can be executed as statements:
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1084 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1085
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1086 <pre>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1087 stat ::= functioncall
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1088 </pre>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1089
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 In this case, all returned values are thrown away.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1092 Function calls are explained in <a href="#fn_calls">Function Calls</a>.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1093 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1094 <%
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1095 end
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1096 }
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1097 logical_stmt = {
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1098 title = "Logical Statement"
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1099 content = function()
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 <p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1102 <a href="#logical_ops">Logical expressions</a> can be statements.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1103 This is useful in cases like this:
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1104 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1105
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1106 <pre>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1107 x==5 or error "x should be 5"
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1108 </pre>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1109 <%
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1110 end
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 local_stmt = {
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1113 title = "Local Declarations"
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1114 content = function()
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 <p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1117 Local variables can be declared anywhere inside a block.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1118 The declaration can include an initial assignment:
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1119 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1120
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1121 <pre>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1122 stat ::= <b>local</b> namelist [&lsquo;<b>=</b>&rsquo; explist]
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1123 </pre>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1124
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 If present, an initial assignment has the same semantics
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1127 of a multiple assignment (see <a href="#assignment">Assignment</a>).
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1128 Otherwise, all variables are initialized with <b>nil</b>.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1129 </p>
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 A chunk is also a block (see <a href="#chunks">Chunks</a>),
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1133 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
1134 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1135
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1136 <p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1137 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
1138 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1139 <%
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1140 end
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 template_stmt = {
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1143 title = "Template Statements"
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1144 content = function()
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 <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
1147 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1148
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1149 <pre>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1150 local name = "Bob"
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1151 %&gt;
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1152 Hello &lt;%= name %&gt;!
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1153 Bye &lt;%= name %&gt;.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1154 &lt;%
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
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1157 <p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1158 is equivalent to the code:
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1159 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1160
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 local name = "Bob"
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1163 require("luan:Io.luan").stdout.write( "Hello ", name , "!\nBye ", name , ".\n" )
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1164 </pre>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1165 <%
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1166 end
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1167 }
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1168 }
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1169 }
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1170 expressions = {
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1171 title = "Expressions"
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1172 content = function()
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 <p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1175 The basic expressions in Luan are the following:
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1176 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1177
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1178 <pre>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1179 exp ::= prefixexp
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1180 exp ::= <b>nil</b> | <b>false</b> | <b>true</b>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1181 exp ::= Numeral
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1182 exp ::= LiteralString
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1183 exp ::= functiondef
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1184 exp ::= tableconstructor
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1185 exp ::= &lsquo;<b>...</b>&rsquo;
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1186 exp ::= exp binop exp
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1187 exp ::= unop exp
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1188 prefixexp ::= var | functioncall | &lsquo;<b>(</b>&rsquo; exp &lsquo;<b>)</b>&rsquo;
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1189 </pre>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1190
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1191 <p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1192 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
1193 variables are explained in <a href="#vars">Variables</a>;
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1194 function definitions are explained in <a href="#fn_def">Function Definitions</a>;
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1195 function calls are explained in <a href="#fn_calls">Function Calls</a>;
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1196 table constructors are explained in <a href="#constructors">Table Constructors</a>.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1197 Vararg expressions,
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1198 denoted by three dots ('<code>...</code>'), can only be used when
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1199 directly inside a vararg function;
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1200 they are explained in <a href="#fn_def">Function Definitions</a>.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1201 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1202
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1203 <p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1204 Binary operators comprise arithmetic operators (see <a href="#arithmetic">Arithmetic Operators</a>),
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1205 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
1206 and the concatenation operator (see <a href="#concatenation">Concatenation</a>).
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1207 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
1208 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
1209 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
1210 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1211
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1212 <p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1213 Both function calls and vararg expressions can result in multiple values.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1214 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
1215 then its return list is adjusted to zero elements,
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1216 thus discarding all returned values.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1217 If an expression is used as the last (or the only) element
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1218 of a list of expressions,
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1219 then no adjustment is made
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1220 (unless the expression is enclosed in parentheses).
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1221 In all other contexts,
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1222 Luan adjusts the result list to one element,
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1223 either discarding all values except the first one
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1224 or adding a single <b>nil</b> if there are no values.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1225 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1226
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1227 <p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1228 Here are some examples:
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1229 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1230
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1231 <pre>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1232 f() -- adjusted to 0 results
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1233 g(f(), x) -- f() is adjusted to 1 result
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1234 g(x, f()) -- g gets x plus all results from f()
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1235 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
1236 a,b = ... -- a gets the first vararg parameter, b gets
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1237 -- the second (both a and b can get nil if there
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1238 -- is no corresponding vararg parameter)
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1239
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1240 a,b,c = x, f() -- f() is adjusted to 2 results
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1241 a,b,c = f() -- f() is adjusted to 3 results
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1242 return f() -- returns all results from f()
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1243 return ... -- returns all received vararg parameters
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1244 return x,y,f() -- returns x, y, and all results from f()
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1245 {f()} -- creates a list with all results from f()
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1246 {...} -- creates a list with all vararg parameters
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1247 {f(), nil} -- f() is adjusted to 1 result
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1248 </pre>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1249
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1250 <p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1251 Any expression enclosed in parentheses always results in only one value.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1252 Thus,
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1253 <code>(f(x,y,z))</code> is always a single value,
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1254 even if <code>f</code> returns several values.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1255 (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
1256 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
1257 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1258 <%
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1259 end
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1260 subs = {
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1261 arithmetic = {
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1262 title = "Arithmetic Operators"
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1263 content = function()
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 <p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1266 Luan supports the following arithmetic operators:
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1267 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1268
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1269 <ul>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1270 <li><b><code>+</code>: </b>addition</li>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1271 <li><b><code>-</code>: </b>subtraction</li>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1272 <li><b><code>*</code>: </b>multiplication</li>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1273 <li><b><code>/</code>: </b>division</li>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1274 <li><b><code>%</code>: </b>modulo</li>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1275 <li><b><code>^</code>: </b>exponentiation</li>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1276 <li><b><code>-</code>: </b>unary minus</li>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1277 </ul>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1278
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1279 <p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1280 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
1281 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1282
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1283 <p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1284 Modulo is defined as the remainder of a division
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1285 that rounds the quotient towards minus infinite (floor division).
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1286 (The Java modulo operator is not used.)
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1287 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1288 <%
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1289 end
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1290 }
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1291 conversions = {
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1292 title = "Coercions and Conversions"
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1293 content = function()
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1294 %>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1295 <p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1296 Luan generally avoids automatic conversions.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1297 String concatenation automatically converts all of its arguments to strings.
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 <p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1301 Luan provides library functions for explicit type conversions.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1302 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1303 <%
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1304 end
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 relational = {
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1307 title = "Relational Operators"
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1308 content = function()
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1309 %>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1310 <p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1311 Luan supports the following relational operators:
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1312 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1313
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1314 <ul>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1315 <li><b><code>==</code>: </b>equality</li>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1316 <li><b><code>~=</code>: </b>inequality</li>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1317 <li><b><code>&lt;</code>: </b>less than</li>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1318 <li><b><code>&gt;</code>: </b>greater than</li>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1319 <li><b><code>&lt;=</code>: </b>less or equal</li>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1320 <li><b><code>&gt;=</code>: </b>greater or equal</li>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1321 </ul>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1322
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 These operators always result in <b>false</b> or <b>true</b>.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1325 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1326
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1327 <p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1328 Equality (<code>==</code>) first compares the type of its operands.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1329 If the types are different, then the result is <b>false</b>.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1330 Otherwise, the values of the operands are compared.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1331 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
1332 </p>
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 Tables
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1336 are compared by reference:
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1337 two objects are considered equal only if they are the same object.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1338 Every time you create a new table,
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1339 it is different from any previously existing table.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1340 Closures are also compared by reference.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1341 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1342
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 You can change the way that Luan compares tables
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1345 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
1346 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1347
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1348 <p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1349 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
1350 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1351
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 Equality comparisons do not convert strings to numbers
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1354 or vice versa.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1355 Thus, <code>"0"==0</code> evaluates to <b>false</b>,
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1356 and <code>t[0]</code> and <code>t["0"]</code> denote different
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1357 entries in a table.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1358 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1359
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1360 <p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1361 The operator <code>~=</code> is exactly the negation of equality (<code>==</code>).
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1362 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1363
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1364 <p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1365 The order operators work as follows.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1366 If both arguments are numbers,
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1367 then they are compared following
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1368 the usual rule for binary operations.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1369 Otherwise, if both arguments are strings,
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1370 then their values are compared according to the current locale.
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1371 Otherwise, Luan tries to call the "lt" or the "le"
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1372 metamethod (see <a href="#meta">Metatables and Metamethods</a>).
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1373 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
1374 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
1375 </p>
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1376 <%
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1377 end
2968e43cdd44 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1656
diff changeset
1378 }
1667
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1379 logical_ops = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1380 title = "Logical Operators"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1381 content = function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1382 %>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1383 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1384 The logical operators in Luan are
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1385 <b>and</b>, <b>or</b>, and <b>not</b>.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1386 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
1387 and anything else as true.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1388 Like the control structures (see <a href="#control">Control Structures</a>),
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1389 the <b>not</b> operator requires a boolean value.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1390 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1391
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1392 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1393 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
1394 The conjunction operator <b>and</b> returns its first argument
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1395 if this value is <b>false</b> or <b>nil</b>;
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1396 otherwise, <b>and</b> returns its second argument.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1397 The disjunction operator <b>or</b> returns its first argument
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1398 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
1399 otherwise, <b>or</b> returns its second argument.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1400 Both <b>and</b> and <b>or</b> use short-circuit evaluation;
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1401 that is,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1402 the second operand is evaluated only if necessary.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1403 Here are some examples:
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1404 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1405
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1406 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1407 10 or 20 --&gt; 10
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1408 10 or error() --&gt; 10
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1409 nil or "a" --&gt; "a"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1410 nil and 10 --&gt; nil
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1411 false and error() --&gt; false
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1412 false and nil --&gt; false
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1413 false or nil --&gt; nil
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1414 10 and 20 --&gt; 20
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1415 </pre>
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 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1418 (In this manual,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1419 <code>--&gt;</code> indicates the result of the preceding expression.)
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1420 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1421 <%
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1422 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1423 }
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1424 concatenation = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1425 title = "Concatenation"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1426 content = function()
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 The string concatenation operator in Luan is
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1430 denoted by two dots ('<code>..</code>').
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1431 All operands are converted to strings.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1432 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1433 <%
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1434 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1435 }
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1436 length = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1437 title = "The Length Operator"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1438 content = function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1439 %>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1440 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1441 The length operator is denoted by the unary prefix operator <code>#</code>.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1442 The length of a string is its number of characters.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1443 The length of a binary is its number of bytes.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1444 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1445
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1446 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1447 A program can modify the behavior of the length operator for
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1448 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
1449 </p>
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 Unless a <code>__len</code> metamethod is given,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1453 the length of a table <code>t</code> is defined
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1454 as the number of elements in <em>sequence</em>,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1455 that is,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1456 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
1457 for some non-negative integer <em>n</em>.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1458 In that case, <em>n</em> is its length.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1459 Note that a table like
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 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1463 {10, 20, nil, 40}
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1464 </pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1465
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1466 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1467 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
1468 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1469 <%
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1470 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1471 }
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1472 precedence = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1473 title = "Precedence"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1474 content = function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1475 %>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1476 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1477 Operator precedence in Luan follows the table below,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1478 from lower to higher priority:
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 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1482 or
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1483 and
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1484 &lt; &gt; &lt;= &gt;= ~= ==
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1485 ..
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 * / %
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1488 unary operators (not # -)
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1489 ^
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1490 </pre>
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 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1493 As usual,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1494 you can use parentheses to change the precedences of an expression.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1495 The concatenation ('<code>..</code>') and exponentiation ('<code>^</code>')
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1496 operators are right associative.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1497 All other binary operators are left associative.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1498 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1499 <%
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1500 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1501 }
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1502 constructors = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1503 title = "Table Constructors"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1504 content = function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1505 %>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1506 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1507 Table constructors are expressions that create tables.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1508 Every time a constructor is evaluated, a new table is created.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1509 A constructor can be used to create an empty table
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1510 or to create a table and initialize some of its fields.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1511 The general syntax for constructors is
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1512 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1513
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1514 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1515 tableconstructor ::= &lsquo;<b>{</b>&rsquo; fieldlist &lsquo;<b>}</b>&rsquo;
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1516 fieldlist ::= [field] {fieldsep [field]}
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1517 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
1518 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
1519 </pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1520
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1521 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1522 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
1523 with key <code>exp1</code> and value <code>exp2</code>.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1524 A field of the form <code>name = exp</code> is equivalent to
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1525 <code>["name"] = exp</code>.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1526 Finally, fields of the form <code>exp</code> are equivalent to
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1527 <code>[i] = exp</code>, where <code>i</code> are consecutive integers
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1528 starting with 1.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1529 Fields in the other formats do not affect this counting.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1530 For example,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1531 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1532
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1533 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1534 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
1535 </pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1536
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1537 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1538 is equivalent to
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1539 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1540
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1541 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1542 do
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1543 local t = {}
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1544 t[f(1)] = g
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1545 t[1] = "x" -- 1st exp
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1546 t[2] = "y" -- 2nd exp
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1547 t.x = 1 -- t["x"] = 1
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1548 t[3] = f(x) -- 3rd exp
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1549 t[30] = 23
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1550 t[4] = 45 -- 4th exp
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1551 a = t
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1552 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1553 </pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1554
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1555 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1556 The order of the assignments in a constructor is undefined.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1557 (This order would be relevant only when there are repeated keys.)
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1558 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1559
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1560 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1561 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
1562 and the expression is a function call or a vararg expression,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1563 then all values returned by this expression enter the list consecutively
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1564 (see <a href="#fn_calls">Function Calls</a>).
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1565 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1566
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1567 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1568 The field list can have an optional trailing separator,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1569 as a convenience for machine-generated code.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1570 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1571 <%
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1572 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1573 }
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1574 fn_calls = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1575 title = "Function Calls"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1576 content = function()
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 A function call in Luan has the following syntax:
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1580 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1581
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1582 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1583 functioncall ::= prefixexp args
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1584 </pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1585
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1586 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1587 In a function call,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1588 first prefixexp and args are evaluated.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1589 The value of prefixexp must have type <em>function</em>.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1590 This function is called
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1591 with the given arguments.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1592 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1593
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1594 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1595 Arguments have the following syntax:
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1596 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1597
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1598 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1599 args ::= &lsquo;<b>(</b>&rsquo; [explist] &lsquo;<b>)</b>&rsquo;
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1600 args ::= tableconstructor
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1601 args ::= LiteralString
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1602 </pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1603
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1604 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1605 All argument expressions are evaluated before the call.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1606 A call of the form <code>f{<em>fields</em>}</code> is
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1607 syntactic sugar for <code>f({<em>fields</em>})</code>;
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1608 that is, the argument list is a single new table.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1609 A call of the form <code>f'<em>string</em>'</code>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1610 (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
1611 is syntactic sugar for <code>f('<em>string</em>')</code>;
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1612 that is, the argument list is a single literal string.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1613 </p>
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 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1616 }
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1617 fn_def = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1618 title = "Function Definitions"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1619 content = function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1620 %>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1621 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1622 The syntax for function definition is
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1623 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1624
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1625 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1626 functiondef ::= <b>function</b> funcbody
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1627 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
1628 end_function ::= <b>end_function</b> | <b>end</b>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1629 </pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1630
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1631 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1632 The following syntactic sugar simplifies function definitions:
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1633 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1634
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1635 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1636 stat ::= <b>function</b> funcname funcbody
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1637 stat ::= <b>local</b> <b>function</b> Name funcbody
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1638 funcname ::= Name {&lsquo;<b>.</b>&rsquo; Name} [&lsquo;<b>:</b>&rsquo; Name]
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1639 </pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1640
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1641 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1642 The statement
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1643 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1644
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1645 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1646 function f () <em>body</em> end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1647 </pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1648
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1649 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1650 translates to
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1651 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1652
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1653 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1654 f = function () <em>body</em> end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1655 </pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1656
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1657 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1658 The statement
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1659 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1660
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1661 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1662 function t.a.b.c.f () <em>body</em> end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1663 </pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1664
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1665 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1666 translates to
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1667 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1668
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1669 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1670 t.a.b.c.f = function () <em>body</em> end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1671 </pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1672
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1673 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1674 The statement
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1675 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1676
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1677 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1678 local function f () <em>body</em> end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1679 </pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1680
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1681 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1682 translates to
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1683 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1684
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1685 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1686 local f; f = function () <em>body</em> end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1687 </pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1688
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1689 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1690 not to
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1691 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1692
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1693 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1694 local f = function () <em>body</em> end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1695 </pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1696
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1697 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1698 (This only makes a difference when the body of the function
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1699 contains references to <code>f</code>.)
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
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 A function definition is an executable expression,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1704 whose value has type <em>function</em>.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1705 When Luan precompiles a chunk,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1706 all its function bodies are precompiled too.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1707 Then, whenever Luan executes the function definition,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1708 the function is <em>instantiated</em> (or <em>closed</em>).
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1709 This function instance (or <em>closure</em>)
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1710 is the final value of the expression.
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 Parameters act as local variables that are
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1715 initialized with the argument values:
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1716 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1717
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1718 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1719 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
1720 </pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1721
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 When a function is called,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1724 the list of arguments is adjusted to
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1725 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
1726 unless the function is a <em>vararg function</em>,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1727 which is indicated by three dots ('<code>...</code>')
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1728 at the end of its parameter list.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1729 A vararg function does not adjust its argument list;
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1730 instead, it collects all extra arguments and supplies them
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1731 to the function through a <em>vararg expression</em>,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1732 which is also written as three dots.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1733 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
1734 similar to a function with multiple results.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1735 If a vararg expression is used inside another expression
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1736 or in the middle of a list of expressions,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1737 then its return list is adjusted to one element.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1738 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
1739 then no adjustment is made
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1740 (unless that last expression is enclosed in parentheses).
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1741 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1742
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1743 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1744 As an example, consider the following definitions:
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1745 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1746 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1747 function f(a, b) end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1748 function g(a, b, ...) end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1749 function r() return 1,2,3 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1750 </pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1751
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 Then, we have the following mapping from arguments to parameters and
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1754 to the vararg expression:
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1755 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1756 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1757 CALL PARAMETERS
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1758
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1759 f(3) a=3, b=nil
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1760 f(3, 4) a=3, b=4
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1761 f(3, 4, 5) runtime error
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1762 f(r(), 10) runtime error
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1763 f(r()) runtime error
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1764
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1765 g(3) a=3, b=nil, ... --&gt; (nothing)
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1766 g(3, 4) a=3, b=4, ... --&gt; (nothing)
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1767 g(3, 4, 5, 8) a=3, b=4, ... --&gt; 5 8
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1768 g(5, r()) a=5, b=1, ... --&gt; 2 3
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1769 </pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1770
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1771 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1772 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
1773 If control reaches the end of a function
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1774 without encountering a <b>return</b> statement,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1775 then the function returns with no results.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1776 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1777 <%
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1778 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1779 }
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1780 }
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 visibility = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1783 title = "Visibility Rules"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1784 content = function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1785 %>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1786 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1787 Luan is a lexically scoped language.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1788 The scope of a local variable begins at the first statement after
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1789 its declaration and lasts until the last non-void statement
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1790 of the innermost block that includes the declaration.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1791 Consider the following example:
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1792 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1793 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1794 x = 10 -- global variable
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1795 do -- new block
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1796 local x = x -- new 'x', with value 10
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1797 print(x) --&gt; 10
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1798 x = x+1
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1799 do -- another block
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1800 local x = x+1 -- another 'x'
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1801 print(x) --&gt; 12
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1802 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1803 print(x) --&gt; 11
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1804 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1805 print(x) --&gt; 10 (the global one)
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1806 </pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1807
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1808 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1809 Notice that, in a declaration like <code>local x = x</code>,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1810 the new <code>x</code> being declared is not in scope yet,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1811 and so the second <code>x</code> refers to the outside variable.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1812 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1813
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1814 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1815 Because of the lexical scoping rules,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1816 local variables can be freely accessed by functions
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1817 defined inside their scope.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1818 A local variable used by an inner function is called
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1819 an <em>upvalue</em>, or <em>external local variable</em>,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1820 inside the inner function.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1821 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1822
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 Notice that each execution of a <b>local</b> statement
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1825 defines new local variables.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1826 Consider the following example:
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1827 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1828 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1829 a = {}
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1830 local x = 20
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1831 for i=1,10 do
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1832 local y = 0
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1833 a[i] = function () y=y+1; return x+y end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1834 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1835 </pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1836
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1837 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1838 The loop creates ten closures
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1839 (that is, ten instances of the anonymous function).
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1840 Each of these closures uses a different <code>y</code> variable,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1841 while all of them share the same <code>x</code>.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1842 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1843 <%
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1844 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1845 }
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1846 }
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 libs = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1849 title = "Standard Libraries"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1850 content = function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1851 %>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1852 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1853 The standard Luan libraries provide useful functions
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1854 that are implemented both in Java and in Luan itself.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1855 How each function is implemented shouldn't matter to the user.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1856 Some of these functions provide essential services to the language
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1857 (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
1858 others provide access to "outside" services (e.g., I/O).
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1859 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1860 <%
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1861 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1862 subs = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1863 default_lib = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1864 title = "Default Environment"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1865 content = function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1866 %>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1867 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1868 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
1869 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1870 <%
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1871 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1872 subs = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1873 require = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1874 title = "<code>require (mod_uri)</code>"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1875 content = function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1876 %>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1877 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1878 Example use:
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1879 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1880 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1881 local Table = require "luan:Table.luan"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1882 </pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1883
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1884 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1885 Could be defined as:
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1886 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1887 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1888 local function require(mod_name)
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1889 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
1890 end
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
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1893 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1894 A special case is:
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 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1897 require "java"
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
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1900 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1901 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
1902 </p>
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 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1905 }
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1906 }
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1907 }
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1908 luan_lib = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1909 title = "Basic Functions"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1910 content = function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1911 %>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1912 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1913 Include this library by:
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1914 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1915 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1916 local Luan = require "luan:Luan.luan"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1917 </pre>
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 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1920 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
1921 </p>
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 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1924 subs = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1925 ["Luan.do_file"] = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1926 title = "<code>Luan.do_file ([uri])</code>"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1927 content = function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1928 %>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1929 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1930 Could be defined as:
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1931 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1932 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1933 function Luan.do_file(uri)
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1934 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
1935 return fn()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1936 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1937 </pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1938 <%
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1939 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1940 }
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1941 ["Luan.error"] = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1942 title = "<code>Luan.error (message)</code>"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1943 content = function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1944 %>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1945 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1946 Throws an error containing the message.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1947 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1948
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1949 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1950 Could be defined as:
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1951 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1952 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1953 function Luan.error(message)
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1954 <a href="#Luan.new_error">Luan.new_error</a>(message).throw()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1955 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1956 </pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1957 <%
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1958 end
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 ["Luan.eval"] = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1961 title = "<code>Luan.eval (text [, source_name [, env]])</code>"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1962 content = function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1963 %>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1964 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1965 Evaluates <code>text</code> as a Luan expression.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1966 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1967
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1968 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1969 Could be defined as:
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1970 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1971 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1972 function Luan.eval(text,source_name, env)
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1973 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
1974 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1975 </pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1976 <%
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1977 end
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 ["Luan.get_metatable"] = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1980 title = "<code>Luan.get_metatable (table)</code>"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1981 content = function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1982 %>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1983 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1984 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
1985 Otherwise,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1986 if the table's metatable has a <code>"__metatable"</code> field,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1987 returns the associated value.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1988 Otherwise, returns the metatable of the given table.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1989 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1990 <%
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1991 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1992 }
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1993 ["Luan.hash_code"] = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1994 title = "<code>Luan.hash_code (v)</code>"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1995 content = function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1996 %>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1997 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1998 Returns the hash code of <code>v</code>.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
1999 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2000 <%
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2001 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2002 }
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2003 ["Luan.ipairs"] = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2004 title = "<code>Luan.ipairs (t)</code>"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2005 content = function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2006 %>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2007 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2008 Returns an iterator function
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2009 so that the construction
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 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2012 for i,v in ipairs(t) do <em>body</em> end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2013 </pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2014
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2015 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2016 will iterate over the key&ndash;value pairs
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2017 (<code>1,t[1]</code>), (<code>2,t[2]</code>), ...,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2018 up to the first nil value.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2019 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2020
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 Could be defined as:
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2023 </p>
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 function Luan.ipairs(t)
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2026 local i = 0
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2027 return function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2028 if i < #t then
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2029 i = i + 1
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2030 return i, t[i]
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2031 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2032 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2033 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2034 </pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2035 <%
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2036 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2037 }
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2038 ["Luan.load"] = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2039 title = "<code>Luan.load (text, [source_name [, env [, persist]]])</code>"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2040 content = function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2041 %>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2042 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2043 Loads a chunk.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2044 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2045
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2046 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2047 The <code>text</code> is compiled.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2048 If there are no syntactic errors,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2049 returns the compiled chunk as a function;
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2050 otherwise, throws an error.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2051 </p>
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 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
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 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
2059 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2060
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2061 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2062 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
2063 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2064 <%
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2065 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2066 }
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2067 ["Luan.load_file"] = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2068 title = "<code>Luan.load_file (file_uri)</code>"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2069 content = function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2070 %>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2071 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2072 Similar to <a href="#Luan.load"><code>load</code></a>,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2073 but gets the chunk from file <code>file_uri</code>.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2074 <code>file_uri</code> can be a string or a uri table.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2075 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2076 <%
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2077 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2078 }
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2079 ["Luan.new_error"] = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2080 title = "<code>Luan.new_error (message)</code>"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2081 content = function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2082 %>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2083 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2084 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
2085 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2086
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2087 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2088 To print the current stack trace, you could do:
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2089 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2090 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2091 Io.print( Luan.new_error "stack" )
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2092 </pre>
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 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2095 }
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2096 ["Luan.pairs"] = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2097 title = "<code>Luan.pairs (t)</code>"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2098 content = function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2099 %>
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 If <code>t</code> has a metamethod <code>__pairs</code>,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2102 calls it with <code>t</code> as argument and returns the
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2103 result from the call.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2104 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2105
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2106 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2107 Otherwise,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2108 returns a function
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2109 so that the construction
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2110 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2111 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2112 for k,v in pairs(t) do <em>body</em> end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2113 </pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2114
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 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
2117 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2118 <%
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2119 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2120 }
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2121 ["Luan.range"] = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2122 title = "<code>Luan.range (start, stop [, step])</code>"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2123 content = function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2124 %>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2125 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2126 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
2127 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2128
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2129 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2130 Example use:
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2131 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2132 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2133 for i in range(1,10) do
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2134 Io.print("count up:",i)
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2135 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2136 for i in range(10,0,-1) do
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2137 Io.print("count down:",i)
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2138 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2139 </pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2140
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2141 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2142 Could be defined as:
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2143 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2144 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2145 function Luan.range(start, stop, step)
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2146 step = step or 1
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2147 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
2148 local i = start
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2149 return function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2150 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
2151 local rtn = i
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2152 i = i + step
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2153 return rtn
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2154 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2155 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2156 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2157 </pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2158 <%
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2159 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2160 }
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2161 ["Luan.raw_equal"] = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2162 title = "<code>Luan.raw_equal (v1, v2)</code>"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2163 content = function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2164 %>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2165 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2166 Checks whether <code>v1</code> is equal to <code>v2</code>,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2167 without invoking any metamethod.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2168 Returns a boolean.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2169 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2170 <%
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2171 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2172 }
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2173 ["Luan.raw_get"] = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2174 title = "<code>Luan.raw_get (table, index)</code>"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2175 content = function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2176 %>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2177 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2178 Gets the real value of <code>table[index]</code>,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2179 without invoking any metamethod.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2180 <code>table</code> must be a table;
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2181 <code>index</code> may be any value.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2182 </p>
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 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2185 }
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2186 ["Luan.raw_len"] = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2187 title = "<code>Luan.raw_len (v)</code>"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2188 content = function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2189 %>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2190 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2191 Returns the length of the object <code>v</code>,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2192 which must be a table or a string,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2193 without invoking any metamethod.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2194 Returns an integer.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2195 </p>
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 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2198 }
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2199 ["Luan.raw_set"] = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2200 title = "<code>Luan.raw_set (table, index, value)</code>"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2201 content = function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2202 %>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2203 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2204 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
2205 without invoking any metamethod.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2206 <code>table</code> must be a table,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2207 <code>index</code> any value different from <b>nil</b>,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2208 and <code>value</code> any Luan value.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2209 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2210 <%
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2211 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2212 }
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2213 ["Luan.set_metatable"] = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2214 title = "<code>Luan.set_metatable (table, metatable)</code>"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2215 content = function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2216 %>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2217 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2218 Sets the metatable for the given table.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2219 If <code>metatable</code> is <b>nil</b>,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2220 removes the metatable of the given table.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2221 If the original metatable has a <code>"__metatable"</code> field,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2222 raises an error.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2223 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2224 <%
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2225 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2226 }
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2227 ["Luan.stringify"] = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2228 title = "<code>Luan.stringify (v [,options])</code>"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2229 content = function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2230 %>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2231 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2232 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
2233 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2234 <%
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2235 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2236 }
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2237 ["Luan.to_string"] = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2238 title = "<code>Luan.to_string (v)</code>"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2239 content = function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2240 %>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2241 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2242 Receives a value of any type and
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2243 converts it to a string in a human-readable format.
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 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2247 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
2248 then <code>to_string</code> calls the corresponding value
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2249 with <code>v</code> as argument,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2250 and uses the result of the call as its result.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2251 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2252 <%
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2253 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2254 }
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2255 ["Luan.type"] = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2256 title = "<code>Luan.type (v)</code>"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2257 content = function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2258 %>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2259 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2260 Returns the type of its only argument, coded as a string.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2261 The possible results of this function are
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2262 "<code>nil</code>" (a string, not the value <b>nil</b>),
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2263 "<code>number</code>",
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2264 "<code>string</code>",
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2265 "<code>binary</code>",
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2266 "<code>boolean</code>",
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2267 "<code>table</code>",
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2268 "<code>function</code>",
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2269 and "<code>java</code>".
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 <%
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2272 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2273 }
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2274 ["Luan.values"] = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2275 title = "<code>Luan.values (&middot;&middot;&middot;)</code>"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2276 content = function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2277 %>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2278 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2279 Returns a function so that the construction
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2280 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2281 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2282 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
2283 </pre>
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 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2286 will iterate over all values of <code>&middot;&middot;&middot;</code>.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2287 </p>
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 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2290 }
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2291 ["Luan.VERSION"] = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2292 title = "<code>Luan.VERSION</code>"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2293 content = function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2294 %>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2295 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2296 A global variable (not a function) that
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2297 holds a string containing the current Luan version.
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 }
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2303 }
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2304 package_lib = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2305 title = "Modules"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2306 content = function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2307 %>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2308 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2309 Include this library by:
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2310 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2311 <pre>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2312 local Package = require "luan:Package.luan"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2313 </pre>
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 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2316 The package library provides basic
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2317 facilities for loading modules in Luan.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2318 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2319 <%
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2320 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2321 subs = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2322 ["Package.load"] = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2323 title = "<code>Package.load (mod_uri)</code>"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2324 content = function()
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 Loads the given module.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2328 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
2329 to determine whether <code>mod_uri</code> is already loaded.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2330 If it is, then <code>Package.load</code> returns the value stored
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2331 at <code>Package.loaded[mod_uri]</code>.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2332 Otherwise, it tries to load a new value for the module.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2333 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2334
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2335 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2336 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
2337 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2338
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2339 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2340 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
2341 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2342
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2343 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2344 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
2345 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2346 <%
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2347 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2348 }
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2349 ["Package.loaded"] = {
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2350 title = "<code>Package.loaded</code>"
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2351 content = function()
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2352 %>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2353 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2354 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
2355 modules are already loaded.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2356 When you load a module <code>mod_uri</code> and
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2357 <code>Package.loaded[mod_uri]</code> is not <b>nil</b>,
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2358 <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
2359 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2360
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2361 <p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2362 This variable is only a reference to the real table;
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2363 assignments to this variable do not change the
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2364 table used by <a href="#Package.load"><code>Package.load</code></a>.
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2365 </p>
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2366 <%
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2367 end
c55373c3a0ce manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1660
diff changeset
2368 }
1656
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
2369 }
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
2370 }
1668
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2371 string_lib = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2372 title = "String Manipulation"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2373 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2374 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2375 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2376 Include this library by:
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2377 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2378 <pre>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2379 local String = require "luan:String.luan"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2380 </pre>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2381
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2382 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2383 This library provides generic functions for string manipulation,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2384 such as finding and extracting substrings, and pattern matching.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2385 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
2386 (not at&nbsp;0, as in Java).
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2387 Indices are allowed to be negative and are interpreted as indexing backwards,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2388 from the end of the string.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2389 Thus, the last character is at position -1, and so on.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2390 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2391 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2392 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2393 subs = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2394 ["String.char"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2395 title = "<code>String.char (&middot;&middot;&middot;)</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2396 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2397 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2398 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2399 Receives zero or more integers.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2400 Returns a string with length equal to the number of arguments,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2401 in which each character has the internal numerical code equal
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2402 to its corresponding argument.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2403 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2404 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2405 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2406 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2407 ["String.encode"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2408 title = "<code>String.encode (s)</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2409 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2410 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2411 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2412 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
2413 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2414 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2415 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2416 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2417 ["String.find"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2418 title = "<code>String.find (s, pattern [, init [, plain]])</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2419 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2420 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2421 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2422 Looks for the first match of
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2423 <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
2424 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
2425 where this occurrence starts and ends;
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2426 otherwise, it returns <b>nil</b>.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2427 A third, optional numerical argument <code>init</code> specifies
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2428 where to start the search;
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2429 its default value is&nbsp;1 and can be negative.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2430 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
2431 turns off the pattern matching facilities,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2432 so the function does a plain "find substring" operation,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2433 with no characters in <code>pattern</code> being considered magic.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2434 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
2435 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2436
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2437 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2438 If the pattern has captures,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2439 then in a successful match
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2440 the captured values are also returned,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2441 after the two indices.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2442 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2443 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2444 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2445 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2446 ["String.format"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2447 title = "<code>String.format (formatstring, &middot;&middot;&middot;)</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2448 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2449 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2450 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2451 Returns a formatted version of its variable number of arguments
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2452 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
2453 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
2454 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2455
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2456 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2457 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
2458 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2459 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2460 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2461 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2462 ["String.gmatch"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2463 title = "<code>String.gmatch (s, pattern)</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2464 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2465 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2466 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2467 Returns an iterator function that,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2468 each time it is called,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2469 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
2470 over the string <code>s</code>.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2471 If <code>pattern</code> specifies no captures,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2472 then the whole match is produced in each call.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2473 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2474
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2475 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2476 As an example, the following loop
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2477 will iterate over all the words from string <code>s</code>,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2478 printing one per line:
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2479 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2480 <pre>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2481 local s = "hello world from Lua"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2482 for w in String.gmatch(s, [[\w+]]) do
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2483 print(w)
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2484 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2485 </pre>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2486
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2487 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2488 The next example collects all pairs <code>key=value</code> from the
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2489 given string into a table:
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 t = {}
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2493 local s = "from=world, to=Lua"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2494 for k, v in String.gmatch(s, [[(\w+)=(\w+)]]) do
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2495 t[k] = v
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2496 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2497 </pre>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2498
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2499 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2500 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
2501 work as an anchor, as this would prevent the iteration.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2502 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2503 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2504 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2505 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2506 ["String.gsub"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2507 title = "<code>String.gsub (s, pattern, repl [, n])</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2508 content = function()
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 Returns a copy of <code>s</code>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2512 in which all (or the first <code>n</code>, if given)
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2513 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
2514 replaced by a replacement string specified by <code>repl</code>,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2515 which can be a string, a table, or a function.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2516 <code>gsub</code> also returns, as its second value,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2517 the total number of matches that occurred.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2518 The name <code>gsub</code> comes from <em>Global SUBstitution</em>.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2519 </p>
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 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
2523 The character&nbsp;<code>\</code> works as an escape character.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2524 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
2525 with <em>d</em> between 1 and 9,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2526 stands for the value of the <em>d</em>-th captured substring.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2527 The sequence <code>$0</code> stands for the whole match.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2528 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2529
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 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
2532 using the first capture as the key.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2533 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2534
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2535 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2536 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
2537 match occurs, with all captured substrings passed as arguments,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2538 in order.
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 In any case,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2543 if the pattern specifies no captures,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2544 then it behaves as if the whole pattern was inside a capture.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2545 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2546
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2547 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2548 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
2549 is not <b>nil</b>,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2550 then it is used as the replacement string;
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2551 otherwise, if it is <b>nil</b>,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2552 then there is no replacement
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2553 (that is, the original match is kept in the string).
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2554 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2555
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 Here are some examples:
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 <pre>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2560 x = String.gsub("hello world", [[(\w+)]], "$1 $1")
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2561 --&gt; x="hello hello world world"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2562
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2563 x = String.gsub("hello world", [[\w+]], "$0 $0", 1)
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2564 --&gt; x="hello hello world"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2565
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2566 x = String.gsub("hello world from Luan", [[(\w+)\s*(\w+)]], "$2 $1")
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2567 --&gt; x="world hello Luan from"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2568
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2569 x = String.gsub("4+5 = $return 4+5$", [[\$(.*?)\$]], function (s)
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2570 return load(s)()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2571 end)
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2572 --&gt; x="4+5 = 9"
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 local t = {name="lua", version="5.3"}
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2575 x = String.gsub("$name-$version.tar.gz", [[\$(\w+)]], t)
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2576 --&gt; x="lua-5.3.tar.gz"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2577 </pre>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2578 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2579 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2580 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2581 ["String.lower"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2582 title = "<code>String.lower (s)</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2583 content = function()
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 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2586 Receives a string and returns a copy of this string with all
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2587 uppercase letters changed to lowercase.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2588 All other characters are left unchanged.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2589 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2590 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2591 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2592 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2593 ["String.match"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2594 title = "<code>String.match (s, pattern [, init])</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2595 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2596 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2597 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2598 Looks for the first <em>match</em> of
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2599 <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
2600 If it finds one, then <code>match</code> returns
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2601 the captures from the pattern;
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2602 otherwise it returns <b>nil</b>.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2603 If <code>pattern</code> specifies no captures,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2604 then the whole match is returned.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2605 A third, optional numerical argument <code>init</code> specifies
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2606 where to start the search;
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2607 its default value is&nbsp;1 and can be negative.
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 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2610 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2611 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2612 ["String.matches"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2613 title = "<code>String.matches (s, pattern)</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2614 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2615 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2616 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2617 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
2618 This function is equivalent to
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 <pre>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2621 return String.match(s,pattern) ~= nil
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2622 </pre>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2623 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2624 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2625 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2626 ["String.regex_quote"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2627 title = "<code>String.regex_quote (s)</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2628 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2629 %>
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 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
2632 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2633 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2634 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2635 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2636 ["String.rep"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2637 title = "<code>String.rep (s, n [, sep])</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2638 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2639 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2640 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2641 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
2642 the string <code>s</code> separated by the string <code>sep</code>.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2643 The default value for <code>sep</code> is the empty string
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2644 (that is, no separator).
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2645 Returns the empty string if <code>n</code> is not positive.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2646 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2647 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2648 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2649 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2650 ["String.reverse"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2651 title = "<code>String.reverse (s)</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2652 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2653 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2654 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2655 Returns a string that is the string <code>s</code> reversed.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2656 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2657 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2658 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2659 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2660 ["String.split"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2661 title = "<code>String.split (s, pattern [, limit])</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2662 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2663 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2664 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2665 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
2666 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2667 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2668 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2669 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2670 ["String.sub"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2671 title = "<code>String.sub (s, i [, j])</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2672 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2673 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2674 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2675 Returns the substring of <code>s</code> that
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2676 starts at <code>i</code> and continues until <code>j</code>;
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2677 <code>i</code> and <code>j</code> can be negative.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2678 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
2679 (which is the same as the string length).
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2680 In particular,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2681 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
2682 with length <code>j</code>,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2683 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
2684 with length <code>i</code>.
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
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2687 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2688 If, after the translation of negative indices,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2689 <code>i</code> is less than 1,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2690 it is corrected to 1.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2691 If <code>j</code> is greater than the string length,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2692 it is corrected to that length.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2693 If, after these corrections,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2694 <code>i</code> is greater than <code>j</code>,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2695 the function returns the empty string.
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 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2699 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2700 ["String.to_binary"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2701 title = "<code>String.to_binary (s)</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2702 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2703 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2704 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2705 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
2706 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2707 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2708 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2709 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2710 ["String.to_number"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2711 title = "<code>String.to_number (s [, base])</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2712 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2713 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2714 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2715 When called with no <code>base</code>,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2716 <code>to_number</code> tries to convert its argument to a number.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2717 If the argument is
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2718 a string convertible to a number,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2719 then <code>to_number</code> returns this number;
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2720 otherwise, it returns <b>nil</b>.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2721 The conversion of strings can result in integers or floats.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2722 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2723
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2724 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2725 When called with <code>base</code>,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2726 then <code>s</code> must be a string to be interpreted as
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2727 an integer numeral in that base.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2728 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
2729 represents&nbsp;10, '<code>B</code>' represents&nbsp;11, and so forth,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2730 with '<code>Z</code>' representing 35.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2731 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
2732 the function returns <b>nil</b>.
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 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2736 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2737 ["String.trim"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2738 title = "<code>String.trim (s)</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2739 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2740 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2741 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2742 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
2743 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2744 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2745 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2746 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2747 ["String.unicode"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2748 title = "<code>String.unicode (s [, i [, j]])</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2749 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2750 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2751 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2752 Returns the internal numerical codes of the characters <code>s[i]</code>,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2753 <code>s[i+1]</code>, ..., <code>s[j]</code>.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2754 The default value for <code>i</code> is&nbsp;1;
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2755 the default value for <code>j</code> is&nbsp;<code>i</code>.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2756 These indices are corrected
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2757 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
2758 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2759 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2760 end
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 ["String.upper"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2763 title = "<code>String.upper (s)</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2764 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2765 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2766 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2767 Receives a string and returns a copy of this string with all
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2768 lowercase letters changed to uppercase.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2769 All other characters are left unchanged.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2770 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
2771 </p>
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 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2774 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2775 }
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 binary_lib = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2778 title = "Binary Manipulation"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2779 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2780 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2781 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2782 Include this library by:
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2783 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2784 <pre>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2785 local Binary = require "luan:Binary.luan"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2786 </pre>
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 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2789 subs = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2790 ["Binary.binary"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2791 title = "<code>Binary.binary (&middot;&middot;&middot;)</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2792 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2793 %>
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 Receives zero or more bytes (as integers).
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2796 Returns a binary with length equal to the number of arguments,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2797 in which each byte has the internal numerical code equal
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2798 to its corresponding argument.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2799 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2800 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2801 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2802 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2803 ["Binary.byte"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2804 title = "<code>Binary.byte (b [, i [, j]])</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2805 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2806 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2807 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2808 Returns the internal numerical codes of the bytes <code>b[i]</code>,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2809 <code>b[i+1]</code>, ..., <code>b[j]</code>.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2810 The default value for <code>i</code> is&nbsp;1;
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2811 the default value for <code>j</code> is&nbsp;<code>i</code>.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2812 These indices are corrected
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2813 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
2814 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2815 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2816 end
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 ["Binary.to_string"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2819 title = "<code>Binary.to_string (b [,charset])</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2820 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2821 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2822 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2823 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
2824 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2825 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2826 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2827 }
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 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2830 table_lib = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2831 title = "Table Manipulation"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2832 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2833 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2834 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2835 Include this library by:
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2836 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2837 <pre>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2838 local Table = require "luan:Table.luan"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2839 </pre>
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 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2842 This library provides generic functions for table manipulation.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2843 It provides all its functions inside the table <code>Table</code>.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2844 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2845 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2846 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2847 subs = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2848 ["Table.clear"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2849 title = "<code>Table.clear (tbl)</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2850 content = function()
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 Clears the table.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2854 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2855 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2856 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2857 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2858 ["Table.concat"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2859 title = "<code>Table.concat (list [, sep [, i [, j]]])</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2860 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2861 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2862 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2863 Given a list,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2864 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
2865 The default value for <code>sep</code> is the empty string,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2866 the default for <code>i</code> is 1,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2867 and the default for <code>j</code> is <code>#list</code>.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2868 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
2869 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2870 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2871 end
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 ["Table.copy"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2874 title = "<code>Table.copy (tbl [, i [, j]])</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2875 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2876 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2877 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2878 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
2879 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
2880 By default, <code>j</code> is <code>#tbl</code>.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2881 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2882 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2883 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2884 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2885 ["Table.insert"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2886 title = "<code>Table.insert (list, pos, value)</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2887 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2888 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2889 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2890 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
2891 shifting up the elements
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2892 <code>list[pos], list[pos+1], &middot;&middot;&middot;, list[#list]</code>.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2893 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2894 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2895 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2896 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2897 ["Table.is_empty"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2898 title = "<code>Table.is_empty (tbl)</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2899 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2900 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2901 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2902 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2903 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2904 ["Table.pack"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2905 title = "<code>Table.pack (&middot;&middot;&middot;)</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2906 content = function()
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 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2909 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
2910 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
2911 Note that the resulting table may not be a sequence.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2912 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2913 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2914 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2915 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2916 ["Table.remove"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2917 title = "<code>Table.remove (list, pos)</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2918 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2919 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2920 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2921 Removes from <code>list</code> the element at position <code>pos</code>,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2922 returning the value of the removed element.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2923 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
2924 it shifts down the elements
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2925 <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
2926 and erases element <code>list[#list]</code>;
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2927 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
2928 or <code>#list + 1</code>;
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2929 in those cases, the function erases the element <code>list[pos]</code>.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2930 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2931 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2932 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2933 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2934 ["Table.size"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2935 title = "<code>Table.size (tbl)</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2936 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2937 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2938 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2939 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2940 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2941 ["Table.sort"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2942 title = "<code>Table.sort (list [, comp])</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2943 content = function()
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 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2946 Sorts list elements in a given order, <em>in-place</em>,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2947 from <code>list[1]</code> to <code>list[#list]</code>.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2948 If <code>comp</code> is given,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2949 then it must be a function that receives two list elements
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2950 and returns true when the first element must come
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2951 before the second in the final order
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2952 (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
2953 If <code>comp</code> is not given,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2954 then the standard Lua operator <code>&lt;</code> is used instead.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2955 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2956
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2957 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2958 The sort algorithm is not stable;
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2959 that is, elements considered equal by the given order
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2960 may have their relative positions changed by the sort.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2961 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2962 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2963 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2964 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2965 ["Table.unpack"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2966 title = "<code>Table.unpack (list [, i [, j]])</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2967 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2968 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2969 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2970 Returns the elements from the given list.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2971 This function is equivalent to
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 <pre>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2974 return list[i], list[i+1], &middot;&middot;&middot;, list[j]
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2975 </pre>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2976
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2977 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2978 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
2979 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2980 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2981 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2982 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2983 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2984 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2985 number_lib = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2986 title = "Number Manipulation"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2987 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2988 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2989 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2990 Include this library by:
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2991 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2992 <pre>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2993 local Number = require "luan:Number.luan"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2994 </pre>
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 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2997 subs = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2998 ["Number.double"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
2999 title = "<code>Number.double (x)</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3000 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3001 %>
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 Returns <code>x</code> as a double.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3004 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3005 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3006 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3007 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3008 ["Number.float"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3009 title = "<code>Number.float (x)</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3010 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3011 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3012 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3013 Returns <code>x</code> as a float.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3014 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3015 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3016 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3017 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3018 ["Number.integer"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3019 title = "<code>Number.integer (x)</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3020 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3021 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3022 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3023 If the value <code>x</code> is convertible to an integer,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3024 returns that integer.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3025 Otherwise throws an error.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3026 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3027 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3028 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3029 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3030 ["Number.long"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3031 title = "<code>Number.long (x)</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3032 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3033 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3034 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3035 If the value <code>x</code> is convertible to an long,
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3036 returns that long.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3037 Otherwise throws an error.
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3038 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3039 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3040 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3041 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3042 ["Number.long_to_string"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3043 title = "<code>Number.long_to_string (i, radix)</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3044 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3045 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3046 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3047 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
3048 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3049 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3050 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3051 }
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3052 ["Number.type"] = {
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3053 title = "<code>Number.type (x)</code>"
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3054 content = function()
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3055 %>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3056 <p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3057 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
3058 </p>
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3059 <%
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3060 end
ef75d9ad5ce9 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents: 1667
diff changeset
3061 }
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 }
1656
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3064 }
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3065 }
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3066 }
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3067
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3068
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3069 return function()
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3070 Io.stdout = Http.response.text_writer()
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3071 %>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3072 <!doctype html>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3073 <html>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3074 <head>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3075 <% head() %>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3076 <title>Luan Reference Manual</title>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3077 <style>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3078 p[keywords] {
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3079 font-family: monospace;
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3080 margin-left: 40px;
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3081 max-width: 700px;
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3082 }
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3083 p[keywords] span {
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3084 display: inline-block;
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3085 width: 100px;
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3086 }
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3087 </style>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3088 </head>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3089 <body>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3090 <% docs_header() %>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3091 <div content>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3092 <h1><a href="manual.html">Luan Reference Manual</a></h1>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3093 <p small>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3094 Original copyright &copy; 2015 Lua.org, PUC-Rio.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3095 Freely available under the terms of the
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3096 <a href="http://www.lua.org/license.html">Lua license</a>.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3097 Modified for Luan.
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3098 </p>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3099 <hr>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3100 <h2>Contents</h2>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3101 <div toc>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3102 <% show_toc(content) %>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3103 </div>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3104 <hr>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3105 <% show_content(content,2) %>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3106 </div>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3107 </body>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3108 </html>
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3109 <%
540bf2343078 manual work
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3110 end