aboutsummaryrefslogtreecommitdiff
path: root/doc/gdscript.lyx
diff options
context:
space:
mode:
Diffstat (limited to 'doc/gdscript.lyx')
-rw-r--r--doc/gdscript.lyx2531
1 files changed, 2531 insertions, 0 deletions
diff --git a/doc/gdscript.lyx b/doc/gdscript.lyx
new file mode 100644
index 000000000..a4b223012
--- /dev/null
+++ b/doc/gdscript.lyx
@@ -0,0 +1,2531 @@
+#LyX 2.0 created this file. For more info see http://www.lyx.org/
+\lyxformat 413
+\begin_document
+\begin_header
+\textclass article
+\use_default_options true
+\maintain_unincluded_children false
+\language english
+\language_package default
+\inputencoding auto
+\fontencoding global
+\font_roman default
+\font_sans default
+\font_typewriter default
+\font_default_family default
+\use_non_tex_fonts false
+\font_sc false
+\font_osf false
+\font_sf_scale 100
+\font_tt_scale 100
+
+\graphics default
+\default_output_format default
+\output_sync 0
+\bibtex_command default
+\index_command default
+\paperfontsize default
+\use_hyperref false
+\papersize default
+\use_geometry false
+\use_amsmath 1
+\use_esint 1
+\use_mhchem 1
+\use_mathdots 1
+\cite_engine basic
+\use_bibtopic false
+\use_indices false
+\paperorientation portrait
+\suppress_date false
+\use_refstyle 0
+\index Index
+\shortcut idx
+\color #008000
+\end_index
+\secnumdepth 3
+\tocdepth 3
+\paragraph_separation indent
+\paragraph_indentation default
+\quotes_language english
+\papercolumns 1
+\papersides 1
+\paperpagestyle default
+\tracking_changes false
+\output_changes false
+\html_math_output 0
+\html_css_as_file 0
+\html_be_strict false
+\end_header
+
+\begin_body
+
+\begin_layout Title
+GD Scripting Language (GDScript)
+\end_layout
+
+\begin_layout Section
+Introduction
+\end_layout
+
+\begin_layout Standard
+GDScript is a high level, dynamically typed programming language used to
+ create content.
+ It uses a syntax that is very similar to the Python language (blocks are
+ indent-based) and it's goal is to be very optimal and tigthly integrated
+ with the engine, allowing great flexibility for content creation and integratio
+n.
+
+\end_layout
+
+\begin_layout Section
+Example
+\end_layout
+
+\begin_layout Standard
+Some people can learn better by just taking a look at the syntax, so here's
+ a simple example of how it looks.
+
+\end_layout
+
+\begin_layout Standard
+\begin_inset listings
+inline false
+status open
+
+\begin_layout Plain Layout
+
+#a file is a class!
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+#inheritance
+\end_layout
+
+\begin_layout Plain Layout
+
+extends BaseClass
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+#member variables
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+var a=5
+\end_layout
+
+\begin_layout Plain Layout
+
+var s="Hello"
+\end_layout
+
+\begin_layout Plain Layout
+
+var arr=[1,2,3]
+\end_layout
+
+\begin_layout Plain Layout
+
+var dict={"key":"value", 2:3}
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+#constants
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+const answer=42
+\end_layout
+
+\begin_layout Plain Layout
+
+const thename="Charly"
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+#built-in vector types
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+var v2 = Vector2(1,2)
+\end_layout
+
+\begin_layout Plain Layout
+
+var v3 = Vector3(1,2,3)
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+#function
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+func some_function(param1,param2):
+\end_layout
+
+\begin_layout Plain Layout
+
+ var local_var=5
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+ if param1 < local_var:
+\end_layout
+
+\begin_layout Plain Layout
+
+ print(param1)
+\end_layout
+
+\begin_layout Plain Layout
+
+ elif param2 > 5:
+\end_layout
+
+\begin_layout Plain Layout
+
+ print(param2)
+\end_layout
+
+\begin_layout Plain Layout
+
+ else:
+\end_layout
+
+\begin_layout Plain Layout
+
+ print("fail!")
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+ for i in range(20):
+\end_layout
+
+\begin_layout Plain Layout
+
+ print(i)
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+ while(param2!=0):
+\end_layout
+
+\begin_layout Plain Layout
+
+ param2-=1
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+ var local_var2 = param1+3
+\end_layout
+
+\begin_layout Plain Layout
+
+ return local_var2
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+#subclass
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+class Something:
+\end_layout
+
+\begin_layout Plain Layout
+
+ var a=10
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+#constructor
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+func _init():
+\end_layout
+
+\begin_layout Plain Layout
+
+ print("constructed!")
+\end_layout
+
+\begin_layout Plain Layout
+
+ var lv = Something.new()
+\end_layout
+
+\begin_layout Plain Layout
+
+ print(lv.a)
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Section
+Language
+\end_layout
+
+\begin_layout Subsection
+Identifiers
+\end_layout
+
+\begin_layout Standard
+Any string that restricts itself to alphabetic characters ('a' to 'z' and
+ 'A' to 'Z'), digits ('0' to '9') and '_' qualifies as an identifier.
+ As an extra restriction, identifiers must not begin with a digit.
+ Identifiers are case-sensitive ('foo' is different to 'FOO').
+\end_layout
+
+\begin_layout Subsection
+Keywords
+\end_layout
+
+\begin_layout Standard
+The following is the list of keywords supported by the language.
+ Since keywords are reserved words (tokens), they can't be used as identifiers.
+\end_layout
+
+\begin_layout Subsection
+Operators
+\end_layout
+
+\begin_layout Standard
+The following is the list of supported operators and their precedence (TODO,
+ change since this was made to reflect python operators)
+\end_layout
+
+\begin_layout Standard
+\begin_inset Tabular
+<lyxtabular version="3" rows="18" columns="2">
+<features tabularvalignment="middle">
+<column alignment="center" valignment="top" width="0">
+<column alignment="center" valignment="top" width="0">
+<row>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Operator
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Note
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+x[index]
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Subscription, Highest Priority
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+x.attribute
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Attribute Reference
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+extends
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Instance Type Checker
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+~
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Bitwise NOT
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+-x
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Negative
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+* / %
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Mult / Div / Remainder
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
++ -
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Addition / Substraction
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+<< >>
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Bit Shifting
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+&
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Bitwise AND
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+^
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Bitwise XOR
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+|
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Bitwise OR
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+< > == != >= <=
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Comparisons
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+in
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Content Test
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+! not
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Boolean NOT
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+and &&
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Boolean AND
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+or ||
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Boolean OR
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+= += -= *= /= ^= &= |=
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Assignment, Lowest Priority
+\end_layout
+
+\end_inset
+</cell>
+</row>
+</lyxtabular>
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Subsection
+Literals
+\end_layout
+
+\begin_layout Standard
+\begin_inset Tabular
+<lyxtabular version="3" rows="6" columns="2">
+<features tabularvalignment="middle">
+<column alignment="center" valignment="top" width="0">
+<column alignment="center" valignment="top" width="0">
+<row>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Literal
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Name
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+45
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Base 10 Integer
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+0x8F51
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Base 16 (hex) Integer
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+3.14, 58.1e-10
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Floating Point Number (real)
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+'Hello',
+\begin_inset Quotes eld
+\end_inset
+
+Hi
+\begin_inset Quotes erd
+\end_inset
+
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Strings
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+@'Hello', @'Hi'
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Internationalized Strings
+\end_layout
+
+\end_inset
+</cell>
+</row>
+</lyxtabular>
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Subsection
+Comments
+\end_layout
+
+\begin_layout Standard
+Anything from a '#' to the end of the line is ignored and is considered
+ a comment.
+\end_layout
+
+\begin_layout Standard
+\begin_inset listings
+lstparams "language=Python"
+inline false
+status open
+
+\begin_layout Plain Layout
+
+# This is a comment
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Section
+Built-in Types
+\end_layout
+
+\begin_layout Subsection
+Basic Bult-In Types
+\end_layout
+
+\begin_layout Standard
+A variable in GDScript can be assigned many of several built-in types.
+
+\end_layout
+
+\begin_layout Subsubsection
+null
+\end_layout
+
+\begin_layout Standard
+'null' is a data type that contains no information, nothing assigned, and
+ it's just empy.
+ It can only be set to one value: 'null'.
+\end_layout
+
+\begin_layout Subsubsection
+bool
+\end_layout
+
+\begin_layout Standard
+Boolean data type, can only contain 'true' or 'false'.
+\end_layout
+
+\begin_layout Subsubsection
+int
+\end_layout
+
+\begin_layout Standard
+Integer data type, can only contain integer numbers, negative and positive.
+\end_layout
+
+\begin_layout Subsubsection
+float
+\end_layout
+
+\begin_layout Standard
+contains a floating point value (real).
+\end_layout
+
+\begin_layout Subsubsection
+String
+\end_layout
+
+\begin_layout Standard
+Sequence of characters in unicode format.
+ Strings can contain the standard C escape sequences.
+\end_layout
+
+\begin_layout Subsection
+Vector Built-In Types
+\end_layout
+
+\begin_layout Subsubsection
+Vector2/Size2
+\end_layout
+
+\begin_layout Standard
+2D vector type, containing x and y fields.
+ Can alternatively access fields as width and height for readability.
+ Can also be accessed as array.
+\end_layout
+
+\begin_layout Subsubsection
+Rect2
+\end_layout
+
+\begin_layout Standard
+2D Rectangle type.
+ Contains 2 vectors fields,
+\begin_inset Quotes eld
+\end_inset
+
+pos
+\begin_inset Quotes erd
+\end_inset
+
+ and size
+\begin_inset Quotes erd
+\end_inset
+
+.
+ Alternatively contains an
+\begin_inset Quotes eld
+\end_inset
+
+end
+\begin_inset Quotes erd
+\end_inset
+
+ field which is
+\begin_inset Quotes eld
+\end_inset
+
+pos+size
+\begin_inset Quotes erd
+\end_inset
+
+.
+\end_layout
+
+\begin_layout Subsubsection
+Vector3
+\end_layout
+
+\begin_layout Standard
+3D vector type.
+ Contains x, y and z fields.
+ Can also be accessed as array.
+\end_layout
+
+\begin_layout Subsubsection
+Matrix32
+\end_layout
+
+\begin_layout Standard
+3x2 matrix used for 2D transforms.
+\end_layout
+
+\begin_layout Subsubsection
+Plane
+\end_layout
+
+\begin_layout Standard
+3D Plane type in normalized form.
+ Contains a
+\begin_inset Quotes eld
+\end_inset
+
+normal
+\begin_inset Quotes erd
+\end_inset
+
+ vector field and a
+\begin_inset Quotes eld
+\end_inset
+
+d
+\begin_inset Quotes erd
+\end_inset
+
+ scalar distance.
+\end_layout
+
+\begin_layout Subsubsection
+Quat
+\end_layout
+
+\begin_layout Standard
+Quaternion, datatype used for representing a 3D rotation.
+ It's useful for interpolating rotations.
+\end_layout
+
+\begin_layout Subsubsection
+AABB/Box3
+\end_layout
+
+\begin_layout Standard
+Axis Aligned bounding box (or alternatively, 3D box).
+ Contains 2 vectors fields,
+\begin_inset Quotes eld
+\end_inset
+
+pos
+\begin_inset Quotes erd
+\end_inset
+
+ and size
+\begin_inset Quotes erd
+\end_inset
+
+.
+ Alternatively contains an
+\begin_inset Quotes eld
+\end_inset
+
+end
+\begin_inset Quotes erd
+\end_inset
+
+ field which is
+\begin_inset Quotes eld
+\end_inset
+
+pos+size
+\begin_inset Quotes erd
+\end_inset
+
+.
+\end_layout
+
+\begin_layout Subsubsection
+Matrix3
+\end_layout
+
+\begin_layout Standard
+3x3 matrix used for 3D rotation and scale.
+ Contains 3 vector fields x,y and z.
+ Can also be accessed as array of 3D vectors.
+\end_layout
+
+\begin_layout Subsubsection
+Transform
+\end_layout
+
+\begin_layout Standard
+3D Transform, contains a Matrix3 field
+\begin_inset Quotes eld
+\end_inset
+
+basis
+\begin_inset Quotes erd
+\end_inset
+
+ and a Vector3 field
+\begin_inset Quotes eld
+\end_inset
+
+origin
+\begin_inset Quotes erd
+\end_inset
+
+.
+\end_layout
+
+\begin_layout Subsection
+Engine Built-In Types
+\end_layout
+
+\begin_layout Subsubsection
+Color
+\end_layout
+
+\begin_layout Standard
+Color datatype, contains r,g,b,a fields.
+ Can also be accessed as h,s,v for hue/saturation/value.
+\end_layout
+
+\begin_layout Subsubsection
+Image
+\end_layout
+
+\begin_layout Standard
+Contains a 2D Image of custom format and allows direct access to the pixels.
+\end_layout
+
+\begin_layout Subsubsection
+NodePath
+\end_layout
+
+\begin_layout Standard
+Compiled path to a node, used mainly in the scene system.
+ Can be easily asigned from/to a String.
+\end_layout
+
+\begin_layout Subsubsection
+RID
+\end_layout
+
+\begin_layout Standard
+Resource ID (RID).
+ Servers use generic RIDs to reference opaque data.
+\end_layout
+
+\begin_layout Subsubsection
+Object
+\end_layout
+
+\begin_layout Standard
+Base class for anything not a built-in type.
+
+\end_layout
+
+\begin_layout Subsubsection
+InputEvent
+\end_layout
+
+\begin_layout Standard
+Events from input devices are contained in very compact form in InputEvent
+ objects.
+ Due to fact they can be received in high amounts from frame to frame, they
+ are optimized in their own datatype.
+
+\end_layout
+
+\begin_layout Subsection
+Container Built-In Types
+\end_layout
+
+\begin_layout Subsubsection
+Array
+\end_layout
+
+\begin_layout Standard
+Generic sequence of objects.
+ It's size can be changed to anything and starts from index 0.
+
+\end_layout
+
+\begin_layout Standard
+\begin_inset listings
+inline false
+status open
+
+\begin_layout Plain Layout
+
+var arr=[]
+\end_layout
+
+\begin_layout Plain Layout
+
+arr=[1,2,3]
+\end_layout
+
+\begin_layout Plain Layout
+
+arr[0]="Hi!"
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+Arrays are allocated linearly in memory, so they are fast, but very large
+ arrays (more than tens of thousands of elements) may cause fragmentation.
+ There are specialized arrays for some built-in datatypes which do not suffer
+ from this and use much less memory.
+\end_layout
+
+\begin_layout Subsubsection
+Dictionary
+\end_layout
+
+\begin_layout Standard
+Associative container which contains values referenced by unique keys.
+\end_layout
+
+\begin_layout Standard
+\begin_inset listings
+inline false
+status open
+
+\begin_layout Plain Layout
+
+var dict={4:5, "a key":"a value", 28:[1,2,3]}
+\end_layout
+
+\begin_layout Plain Layout
+
+dict["Hi!"]=0
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Subsubsection
+ByteArray
+\end_layout
+
+\begin_layout Standard
+Array of bytes.
+ Can only contains bytes (integers from 0 to 255).
+ Optimized for memory usage, can't fragment the memory.
+\end_layout
+
+\begin_layout Subsubsection
+IntArray
+\end_layout
+
+\begin_layout Standard
+Array of integers.
+ Can only contain integers.
+ Optimized for memory usage, can't fragment the memory.
+\end_layout
+
+\begin_layout Subsubsection
+FloatArray
+\end_layout
+
+\begin_layout Standard
+Array of floats, can only contain floats.
+ Optimized for memory usage, can't fragment the memory.
+\end_layout
+
+\begin_layout Subsubsection
+StringArray
+\end_layout
+
+\begin_layout Standard
+Array of strings, can only contain strings.
+ Optimized for memory usage, can't fragment the memory.
+\end_layout
+
+\begin_layout Subsubsection
+Vector2Array
+\end_layout
+
+\begin_layout Standard
+Array of Vector2, can only contain 2D Vectors.
+ Optimized for memory usage, can't fragment the memory.
+\end_layout
+
+\begin_layout Subsubsection
+Vector3Array
+\end_layout
+
+\begin_layout Standard
+Array of Vector3, can only contain 3D Vectors.
+ Optimized for memory usage, can't fragment the memory.
+\end_layout
+
+\begin_layout Subsubsection
+ColorArray
+\end_layout
+
+\begin_layout Standard
+Array of Color, can only contains colors.
+ Optimized for memory usage, can't fragment the memory.
+\end_layout
+
+\begin_layout Section
+Data
+\end_layout
+
+\begin_layout Subsection
+Variables
+\end_layout
+
+\begin_layout Standard
+Variables can exist as class members or local to functions.
+ They are created with the
+\begin_inset Quotes eld
+\end_inset
+
+var
+\begin_inset Quotes erd
+\end_inset
+
+ keyword and may be, optionally, be assigned a value upon initialization.
+\end_layout
+
+\begin_layout Standard
+\begin_inset listings
+inline false
+status open
+
+\begin_layout Plain Layout
+
+var a # datatype is null by default
+\end_layout
+
+\begin_layout Plain Layout
+
+var b = 5
+\end_layout
+
+\begin_layout Plain Layout
+
+var c = 3.8
+\end_layout
+
+\begin_layout Plain Layout
+
+var d = b+c # variables are always initialized in order
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Subsection
+Constants
+\end_layout
+
+\begin_layout Standard
+Constants are similar to variables, but must be constants or constant expression
+s and must be assigned on initialization.
+\end_layout
+
+\begin_layout Standard
+\begin_inset listings
+inline false
+status open
+
+\begin_layout Plain Layout
+
+const a = 5
+\end_layout
+
+\begin_layout Plain Layout
+
+const b = Vector2(20,20)
+\end_layout
+
+\begin_layout Plain Layout
+
+const c = 10+20 # constant expression
+\end_layout
+
+\begin_layout Plain Layout
+
+const d = Vector2(20,30).x # constant expression: 20
+\end_layout
+
+\begin_layout Plain Layout
+
+const e = [1,2,3,4][0] # constant expression: 1
+\end_layout
+
+\begin_layout Plain Layout
+
+const f = sin(20) # sin() can be used in constant expression
+\end_layout
+
+\begin_layout Plain Layout
+
+const g = x+20 # invalid, not a constant expression!
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Subsection
+Functions
+\end_layout
+
+\begin_layout Standard
+Functions always belong to a class.
+ The scope priority for variable look-up is: local -> class member -> global.
+
+\begin_inset Quotes eld
+\end_inset
+
+self
+\begin_inset Quotes erd
+\end_inset
+
+ is provided as an option for accessing class members but is not required
+ always (and must
+\emph on
+not
+\emph default
+ be defined as first parameter, like in Python).
+ For performance reasons, functions are not considered class members, so
+ they can't be referenced directly.
+ A function can return at any point.
+ The default return value is null.
+\end_layout
+
+\begin_layout Standard
+\begin_inset listings
+inline false
+status open
+
+\begin_layout Plain Layout
+
+func myfunction(a,b):
+\end_layout
+
+\begin_layout Plain Layout
+
+ print(a)
+\end_layout
+
+\begin_layout Plain Layout
+
+ print(b)
+\end_layout
+
+\begin_layout Plain Layout
+
+ return a+b # return is optional, otherwise null is returned
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Subsubsection
+Statements and Control Flow
+\end_layout
+
+\begin_layout Standard
+Statements are standard, and can be assignments, function calls, control
+ flow structures, etc (see below).
+
+\begin_inset Quotes eld
+\end_inset
+
+;
+\begin_inset Quotes erd
+\end_inset
+
+ as separator is entirely optional.
+\end_layout
+
+\begin_layout Subsubsection
+if/else/elif
+\end_layout
+
+\begin_layout Standard
+Simple conditions are created by using the
+\emph on
+if/else/elif
+\emph default
+ syntax.
+ Parenthesis around statements is allowed but not requiered.
+ Given the nature of the tab-based indentation, elif can be used instead
+ of else:/if: to mantain a level of indentation.
+\end_layout
+
+\begin_layout Standard
+\begin_inset listings
+inline false
+status open
+
+\begin_layout Plain Layout
+
+if [expression]:
+\end_layout
+
+\begin_layout Plain Layout
+
+ statement(s)
+\end_layout
+
+\begin_layout Plain Layout
+
+elif [expression]:
+\end_layout
+
+\begin_layout Plain Layout
+
+ statement(s)
+\end_layout
+
+\begin_layout Plain Layout
+
+else:
+\end_layout
+
+\begin_layout Plain Layout
+
+ statement(s)
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Subsubsection
+while
+\end_layout
+
+\begin_layout Standard
+Simple loops are created by using
+\emph on
+while
+\emph default
+ syntax.
+ Loops can be broken using
+\emph on
+break
+\emph default
+, or continued using
+\emph on
+continue
+\emph default
+:
+\end_layout
+
+\begin_layout Standard
+\begin_inset listings
+inline false
+status open
+
+\begin_layout Plain Layout
+
+while [expression]:
+\end_layout
+
+\begin_layout Plain Layout
+
+ statement(s)
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Subsubsection
+for
+\end_layout
+
+\begin_layout Standard
+To iterate a range, array or table a
+\emph on
+for
+\emph default
+ loop is used.
+ For loops store the index in the loop variable on each iteration.
+\end_layout
+
+\begin_layout Standard
+\begin_inset listings
+inline false
+status open
+
+\begin_layout Plain Layout
+
+for i in [0,1,2]:
+\end_layout
+
+\begin_layout Plain Layout
+
+ statement # loop iterates 3 times, i being 0,1 and 2
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+var dict = {"a":0, "b":1, "c": 2}
+\end_layout
+
+\begin_layout Plain Layout
+
+for i in dict:
+\end_layout
+
+\begin_layout Plain Layout
+
+ print(dict[i]) # loop iterates the keys, i being "a","b" and c".
+ It prints 0, 1 and 2.
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+for i in range(3):
+\end_layout
+
+\begin_layout Plain Layout
+
+ statement # similar to [0,1,2] but does not allocate an array
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+for i in range(1,3):
+\end_layout
+
+\begin_layout Plain Layout
+
+ statement # similar to [1,2] but does not allocate an array
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+for i in range(2,8,2):
+\end_layout
+
+\begin_layout Plain Layout
+
+ statement # similar to [2,4,6] but does not allocate an array
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Section
+Classes
+\end_layout
+
+\begin_layout Standard
+By default, the body of a script file is an unnamed class, and it can only
+ be referenced externally as a resource or file.
+ Class syntax is meant to be very compact and can only contain member variables
+ or functions.
+ Static functions are allowed, but not static members (in the spirit of
+ thread safety, since scripts can be initialized in separate threads without
+ the user knowing).
+ In the same way, member variables (including arrays and dictionaries) are
+ initialized every time an instance is created.
+
+\end_layout
+
+\begin_layout Subsection
+Class File Example
+\end_layout
+
+\begin_layout Standard
+Example of a class file, imagine it being stored in a file like myclass.gd.
+\end_layout
+
+\begin_layout Standard
+\begin_inset listings
+inline false
+status open
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+var a=5
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+function print_value_of_a():
+\end_layout
+
+\begin_layout Plain Layout
+
+ print(a)
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Subsection
+Inheritance
+\end_layout
+
+\begin_layout Standard
+A class-file can inherit from a global class, another file or a subclass
+ inside another file.
+ Multiple inheritance is not allowed.
+ The
+\begin_inset Quotes eld
+\end_inset
+
+extends
+\begin_inset Quotes erd
+\end_inset
+
+ syntax is used:
+\end_layout
+
+\begin_layout Standard
+\begin_inset listings
+inline false
+status open
+
+\begin_layout Plain Layout
+
+# extend from some class (global)
+\end_layout
+
+\begin_layout Plain Layout
+
+extends SomeClass
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+# optionally, extend from another file
+\end_layout
+
+\begin_layout Plain Layout
+
+extends "somefile.gd"
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+# extend from a subclass in another file
+\end_layout
+
+\begin_layout Plain Layout
+
+extends "somefile.gd".Subclass
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Subsection
+Inheritance Testing
+\end_layout
+
+\begin_layout Standard
+It is possible to check if an instance inherits from a given class.
+ For this the
+\begin_inset Quotes eld
+\end_inset
+
+extends
+\begin_inset Quotes erd
+\end_inset
+
+ keyword can be used as an operator instead:
+\end_layout
+
+\begin_layout Standard
+\begin_inset listings
+inline false
+status open
+
+\begin_layout Plain Layout
+
+static var enemy_class = preload("enemy.gd") # cache the enemy class
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+[..]
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+if ( entity extends enemy_class ):
+\end_layout
+
+\begin_layout Plain Layout
+
+ entity.apply_damage()
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Subsection
+Constructor
+\end_layout
+
+\begin_layout Standard
+A class can have an optional constructor, a function named
+\begin_inset Quotes eld
+\end_inset
+
+_init
+\begin_inset Quotes erd
+\end_inset
+
+ that is called when the class is instanced.
+\end_layout
+
+\begin_layout Subsection
+Sub Classes
+\end_layout
+
+\begin_layout Standard
+A class file can have subclasses.
+ Syntax should be straightforward:
+\end_layout
+
+\begin_layout Standard
+\begin_inset listings
+inline false
+status open
+
+\begin_layout Plain Layout
+
+class SomeSubClass:
+\end_layout
+
+\begin_layout Plain Layout
+
+ var a=5
+\end_layout
+
+\begin_layout Plain Layout
+
+ function print_value_of_a():
+\end_layout
+
+\begin_layout Plain Layout
+
+ print(a)
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+function _init():
+\end_layout
+
+\begin_layout Plain Layout
+
+ var sc = SomeSubClass.new() #instance by calling built-in new
+\end_layout
+
+\begin_layout Plain Layout
+
+ sc.print_value_of_a()
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Subsection
+Classes as Objects
+\end_layout
+
+\begin_layout Standard
+It may be desired at some point to load a class from a file and then instance
+ it.
+ Since the global scope does not exist, classes must be loaded as a resource.
+ Instancing is done by calling the
+\begin_inset Quotes eld
+\end_inset
+
+new
+\begin_inset Quotes erd
+\end_inset
+
+ function in a class object:
+\end_layout
+
+\begin_layout Standard
+\begin_inset listings
+inline false
+status open
+
+\begin_layout Plain Layout
+
+#load the class (loaded every time the script is instanced)
+\end_layout
+
+\begin_layout Plain Layout
+
+var MyClass = load("myclass.gd")
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+#alternatively, using the preload() function preloads the class at compile
+ time
+\end_layout
+
+\begin_layout Plain Layout
+
+var MyClass2 = preload("myclass.gd")
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+function _init():
+\end_layout
+
+\begin_layout Plain Layout
+
+ var a = MyClass.new()
+\end_layout
+
+\begin_layout Plain Layout
+
+ a.somefunction()
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Subsection
+Exports
+\end_layout
+
+\begin_layout Standard
+Class members can be exported.
+ This means their value gets saved along with a scene.
+ If class members have initializers to constant expressions, they will be
+ available for editing in the property editor.
+ Exporting is done by using the export keyword:
+\end_layout
+
+\begin_layout Standard
+\begin_inset listings
+inline false
+status open
+
+\begin_layout Plain Layout
+
+extends Button
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+export var data # value will be saved
+\end_layout
+
+\begin_layout Plain Layout
+
+export var number=5 # also available to the property editor
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+One of the fundamental benefits of exporting member variables is to have
+ them visible in the property editor.
+ This way artists and game designers can modify values that later influence
+ how the program runs.
+ For this, a special export syntax is provided for more detail in the exported
+ variables:
+\end_layout
+
+\begin_layout Standard
+\begin_inset listings
+inline false
+status open
+
+\begin_layout Plain Layout
+
+#if the exported value assigns a constant or constant expression, the type
+ will be infered and used in the editor
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+export var number=5
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+#export can take a basic datatype as argument, which will be used in the
+ editor
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+export(int) var number
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+#export can also take a resource type as hint
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+export(Texture) var character_face
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+#integers and strings hint enumerated values
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+export(int,"Warrior","Magician","Thief") var character_class # (editor will
+ set them as 0,1 and 2)
+\end_layout
+
+\begin_layout Plain Layout
+
+export(String,"Rebecca","Mary","Leah") var character_name
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+#strings as paths
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+export(String,FILE) var f # string is a path to a file
+\end_layout
+
+\begin_layout Plain Layout
+
+export(String,DIR) var f # string is a path to a directory
+\end_layout
+
+\begin_layout Plain Layout
+
+export(String,FILE,"*.txt") var f # string is a path to a file, custom filter
+ provided as hint
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+#integers and floats hint ranges
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+export(int,20) var i # 0 to 20 allowed
+\end_layout
+
+\begin_layout Plain Layout
+
+export(int,-10,20) var j # -10 to 20 allowed
+\end_layout
+
+\begin_layout Plain Layout
+
+export(float,-10,20,0.2) var k # -10 to 20 allowed, with stepping of 0.2
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+#color can hint availability of alpha
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+export(Color,RGB) var col # Color is RGB
+\end_layout
+
+\begin_layout Plain Layout
+
+export(Color,RGBA) var col # Color is RGBA
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+It must be noted that even if the script is not being run while at the editor,
+ the exported properties are still editable (see below for
+\begin_inset Quotes eld
+\end_inset
+
+tool
+\begin_inset Quotes erd
+\end_inset
+
+).
+\end_layout
+
+\begin_layout Subsection
+Static Functions
+\end_layout
+
+\begin_layout Standard
+A function can be declared static.
+ When static, it has no access to the instance member variables or
+\begin_inset Quotes eld
+\end_inset
+
+self
+\begin_inset Quotes erd
+\end_inset
+
+.
+ This is mainly useful to make libraries of helper functions:
+\end_layout
+
+\begin_layout Standard
+\begin_inset listings
+inline false
+status open
+
+\begin_layout Plain Layout
+
+static func sum2(a,b):
+\end_layout
+
+\begin_layout Plain Layout
+
+ return a+b
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Subsection
+Asserting
+\end_layout
+
+\begin_layout Standard
+It is possible to assert a condition, which will cause a debugger break
+ if false.
+ Just use the built-in 'assert' function.
+\end_layout
+
+\begin_layout Standard
+\begin_inset listings
+inline false
+status open
+
+\begin_layout Plain Layout
+
+assert(a==2)
+\end_layout
+
+\begin_layout Plain Layout
+
+# if a is not 2, it will generate a debugger break
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Subsection
+Tool Mode
+\end_layout
+
+\begin_layout Standard
+Scripts by default don't run inside the editor, and only the exported properties
+ can be changed.
+ In some cases it is desired that they do (as long as they don't execute
+ game code or manually avoid doing so).
+ For this, the
+\begin_inset Quotes eld
+\end_inset
+
+tool
+\begin_inset Quotes erd
+\end_inset
+
+ keyword exists, and must be placed at the top of the file:
+\end_layout
+
+\begin_layout Standard
+\begin_inset listings
+inline false
+status open
+
+\begin_layout Plain Layout
+
+tool
+\end_layout
+
+\begin_layout Plain Layout
+
+extends Button
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+func _init():
+\end_layout
+
+\begin_layout Plain Layout
+
+ print("Hello")
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Subsection
+Memory Management
+\end_layout
+
+\begin_layout Standard
+If a class inherits from
+\emph on
+Reference
+\emph default
+, then instances will be freed when no longer in use.
+ No garbage collector exists, just simple reference counting.
+ By default, all classes that don't define inheritance extend
+\emph on
+Reference
+\emph default
+.
+ If this is not desired, then a class must inherit
+\emph on
+Object
+\emph default
+ manually and must call instance.free().
+ To avoid reference cycles that can't be freed, a weakref() function is
+ provided for creating weak references.
+
+\end_layout
+
+\begin_layout Subsection
+Function References
+\end_layout
+
+\begin_layout Standard
+Functions can't be referenced because they are not treated as class members.
+ There are two alternatives to this, though.
+ The
+\begin_inset Quotes eld
+\end_inset
+
+call
+\begin_inset Quotes erd
+\end_inset
+
+ function or the funcref() helper.
+\end_layout
+
+\begin_layout Standard
+\begin_inset listings
+inline false
+status open
+
+\begin_layout Plain Layout
+
+instance.call("funcname",args) # call a function by bane
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+var fr = funcref(instance,"funcname") #create a function ref
+\end_layout
+
+\begin_layout Plain Layout
+
+fr.exec(args)
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_body
+\end_document