Tutorial/Basics
Program Structure
Neko programs are fairly loose in their structure. Variable declarations, function definitions, and instructions may be essentially placed anywhere. Code outside any functions is at the top-level and will be executed as it is encountered. Some simple programs are shown below.
Braces are used to group together multiple expressions, so they are often optional if only a single expression is used.
Built-in Functions
Neko comes with many built-in functions, all of which begin with a dollar sign ($). More information about built-ins can be found here. These functions are always available and may be used anywhere.
Control Flow Constructs
Neko has several flow control constructs: if, while, do-while, switch, and goto are all available.
Comments
Single line comments start with // and multiline comments can be contained within /* and */.
//Single line comment
/*
multiple
line
comment
*/
Variables
Variables may have local, global, or function scope. Variables which use the var keyword at their first declaration are local to the current scope and are only available after their declaration. Without the var keyword, variables are global.
var x = 1; //local
y = 2; //global
f = function() {
z = 3; //global
x = 4; //function scope (of previously declared 'x')
}
f();
$print(x, " ", y, " ", z, "\n"); //prints "1 2 3"
Uninitialized variables will have the value null.
Numbers
Numbers in Neko are either 31-bit integers or 64-bit floats.
Booleans
Neko uses true and false for boolean values. Also, null is considered to be false.
Strings
Strings are arrays of characters. String literals are contained between double quotes (“).
Functions
Functions in Neko are closures which copy their surrounding scope. Local variables declared before the function will be copied into the local scope, while global variables (even those declared after the closure) are accessible via reference. Each instance of a function carries its own environment with local copies of non-global variables.
var y = 1;
var f = function(x, z) {
y = 3;
$print(w, "\n"); //prints "4"
}
w = 4;
f(1, 2);
$print(y, "\n"); //prints "1"
Neko does not support default arguments.
You can use a variable number of arguments by wrapping a function with $varargs:
f = $varargs(function(args) {
$print(args);
})
f(1, 2, 3); //prints "[1,2,3]"
Note: Since $varargs is a call to a C function, it will inhibit tail-call optimization.
Objects
Objects in Neko are quite simple. They are essentially just a set of fields (instance variables or slots) which may be set and retrieved.
var obj = $new(null);
obj.a = 1;
obj.b = function() { "b" }
obj.b();
Neko objects, by default, do not have any parent classes. You can set the parent class of an object via the $objsetproto method. Neko only supports single inheritance. You can also make a copy or clone of an object by passing in an object to the $new method.
Note that, when using any of the built-in functions for manipulating objects, arguments which are field names must be hashed using the $hash method.
Manipulating Values
Besides numbers and booleans, everything else in Neko is modified and accessed through built-in functions. Arrays, strings, hashtables, and objects all have a set of functions (listed here) for manipulating their values.