549 lines
8.5 KiB
Plaintext
549 lines
8.5 KiB
Plaintext
// This is a one line comment.
|
|
/* an inner comment */
|
|
|
|
/* nested /* comments */ */
|
|
|
|
/*
|
|
/*
|
|
Multi-line.
|
|
*/
|
|
*/
|
|
|
|
// Binary blob escape.
|
|
//"some text \B(3)("\") ouhyeah" == "\"\\\"";
|
|
"some text \B(3)("\") ouhyeah" == "\"\\\"";
|
|
'some text \B(3)('\') ouhyeah' == '\'\\\'';
|
|
|
|
//"\B(4)()"'()";
|
|
"\B(4)()"'()";
|
|
'\B(4)()'"()';
|
|
|
|
//blob size limits
|
|
"hey ! \B(0)() oh !"
|
|
|
|
//blob format is wrong
|
|
"hey ! \B(2)(aaa) oh !"
|
|
"hey ! \B(100)(aaa) oh !"
|
|
|
|
//multiple blob in a string
|
|
"hey ! \B(3)(aaa) hey ! \B(3)(aaa) oh !"
|
|
|
|
// multiple digits blob size
|
|
"hey ! \B(10)(aaaaaaaaaa) !"
|
|
"hey ! \B(10)(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) !"
|
|
"hey ! \B(100)(a) !"
|
|
|
|
// multiple digits blob size
|
|
"hey ! \B(007)(aaaaaaa) !"
|
|
"hey ! \B(007)(aa) !"
|
|
"hey ! \B(007)(aaaaaaaaaaaaaaaaaa) !"
|
|
|
|
// deprecated and restricted keyworks
|
|
emit Event.new;
|
|
static int main();
|
|
|
|
loopn (2) {echo("a");};
|
|
|
|
foreach (var i : [1,2,3,4]) {
|
|
echo(i);
|
|
};
|
|
|
|
function() {};
|
|
|
|
var 'if';
|
|
var this.'else';
|
|
|
|
var '%x';
|
|
var '1 2 3';
|
|
var this.'[]';
|
|
|
|
// angles
|
|
pi == 180deg;
|
|
pi == 200grad;
|
|
|
|
// Dictionary
|
|
[ => ]; // The empty dictionary
|
|
|
|
// duration
|
|
1d == 24h;
|
|
0.5d == 12h;
|
|
1h == 60min;
|
|
1min == 60s;
|
|
1s == 1000ms;
|
|
|
|
1s == 1;
|
|
1s 2s 3s == 6;
|
|
1s 1ms == 1.001;
|
|
1ms 1s == 1.001;
|
|
|
|
|
|
1 == 1;
|
|
1 == 1.0;
|
|
1.2 == 1.2000;
|
|
1.234e6 == 1234000;
|
|
1e+11 == 1E+11;
|
|
1e10 == 10000000000;
|
|
1e30 == 1e10 * 1e10 * 1e10;
|
|
|
|
|
|
0.000001;
|
|
|
|
0.0000001;
|
|
|
|
0.00000000001;
|
|
|
|
1e+3;
|
|
|
|
1E-5;
|
|
|
|
|
|
1.;
|
|
// [00004701:error] !!! syntax error: unexpected ;
|
|
|
|
0x2a == 42;
|
|
0x2A == 42;
|
|
0xabcdef == 11259375;
|
|
0xABCDEF == 11259375;
|
|
0xFFFFFFFF == 4294967295;
|
|
|
|
|
|
//123foo;
|
|
//[00005658:error] !!! syntax error: invalid token: '123foo'
|
|
//12.3foo;
|
|
//[00018827:error] !!! syntax error: invalid token: '12.3foo'
|
|
0xabcdef;
|
|
//[00060432] 11259375
|
|
//0xabcdefg;
|
|
//[00061848:error] !!! syntax error: invalid token: '0xabcdefg'
|
|
|
|
|
|
[]; // The empty list
|
|
[1, 2, 3];
|
|
|
|
// Special characters.
|
|
"\"" == "\"";
|
|
"\\" == "\\";
|
|
|
|
// ASCII characters.
|
|
"\a" == "\007"; "\a" == "\x07";
|
|
"\b" == "\010"; "\b" == "\x08";
|
|
"\f" == "\014"; "\f" == "\x0c";
|
|
"\n" == "\012"; "\n" == "\x0a";
|
|
"\r" == "\015"; "\r" == "\x0d";
|
|
"\t" == "\011"; "\t" == "\x09";
|
|
"\v" == "\013"; "\v" == "\x0b";
|
|
|
|
// Octal escapes.
|
|
"\0" == "\00"; "\0" == "\000";
|
|
"\0000" == "\0""0";
|
|
"\062\063" == "23";
|
|
|
|
// Hexadecimal escapes.
|
|
"\x00" == "\0";
|
|
"\x32\x33" == "23";
|
|
|
|
|
|
|
|
"foo" "bar" "baz" == "foobarbaz";
|
|
|
|
// Tuples
|
|
();
|
|
[00000000] ()
|
|
(1,);
|
|
[00000000] (1,)
|
|
(1, 2);
|
|
[00000000] (1, 2)
|
|
(1, 2, 3, 4,);
|
|
[00000000] (1, 2, 3, 4)
|
|
|
|
function Global.verboseId(var x)
|
|
{
|
|
echo(x) | x
|
|
}|;
|
|
class verboseId(Global).math : verboseId(Math)
|
|
{
|
|
};
|
|
|
|
{
|
|
for (3)
|
|
{
|
|
sleep(1s);
|
|
echo("ping");
|
|
},
|
|
sleep(0.5s);
|
|
for (3)
|
|
{
|
|
sleep(1s);
|
|
echo("pong");
|
|
},
|
|
};
|
|
|
|
1 + 1 == 2;
|
|
1 - 2 == -1;
|
|
2 * 3 == 6;
|
|
10 / 2 == 5;
|
|
2 ** 10 == 1024;
|
|
-(1 + 2) == -3;
|
|
1 + 2 * 3 == 7;
|
|
(1 + 2) * 3 == 9;
|
|
-2 ** 2 == -4;
|
|
- - - - 1 == 1;
|
|
|
|
a = b
|
|
a += b
|
|
a -= b
|
|
a *= b
|
|
a /= b
|
|
a %= b
|
|
a ^= b
|
|
|
|
|
|
var value = 0|;
|
|
var valueAlias = value|;
|
|
value += 10;
|
|
valueAlias;
|
|
var myList = []|;
|
|
var myList.specialFeature = 42|;
|
|
myList += [1, 2, 3];
|
|
myList.specialFeature;
|
|
var myOtherList = myList + [4, 5];
|
|
myOtherList.specialFeature;
|
|
var something = []|;
|
|
var somethingElse = something|;
|
|
something += [1, 2];
|
|
somethingElse += [3, 4];
|
|
something;
|
|
|
|
|
|
class Counter
|
|
{
|
|
var count = 0;
|
|
function init (n) { var this.count = n };
|
|
// Display the value, and the identity.
|
|
function asString() { "%s @ %s" % [count, uid ] };
|
|
function '+'(var n) { new(count + n) };
|
|
function '-'(var n) { new(count - n) };
|
|
}|;
|
|
|
|
|
|
class ImmutableCounter : Counter
|
|
{
|
|
function '+='(var n) { this + n };
|
|
function '-='(var n) { this - n };
|
|
}|;
|
|
|
|
var ic1 = ImmutableCounter.new(0);
|
|
var ic2 = ic1;
|
|
|
|
ic1 += 1;
|
|
ic1;
|
|
ic2;
|
|
|
|
|
|
a << b
|
|
a >> b
|
|
a ^ b
|
|
|
|
4 << 2 == 16;
|
|
4 >> 2 == 1;
|
|
|
|
!a
|
|
a && b
|
|
a || b
|
|
|
|
true && true;
|
|
true || false;
|
|
!true == false;
|
|
true || (1 / 0);
|
|
(false && (1 / 0)) == false;
|
|
|
|
a == b
|
|
a != b
|
|
a === b
|
|
a !== b
|
|
a ~= b
|
|
a =~= b
|
|
a < b
|
|
a <= b
|
|
a > b
|
|
a >= b
|
|
|
|
assert{
|
|
! (0 < 0);
|
|
0 <= 0;
|
|
0 == 0;
|
|
0 !== 0;
|
|
};
|
|
|
|
a in b
|
|
a not in b
|
|
a[args]
|
|
a[args] = v
|
|
|
|
1 in [0, 1, 2];
|
|
3 not in [0, 1, 2];
|
|
|
|
"one" in ["zero" => 0, "one" => 1, "two" => 2];
|
|
"three" not in ["zero" => 0, "one" => 1, "two" => 2];
|
|
|
|
a.b
|
|
a.b(args)
|
|
a->b
|
|
a->b = v
|
|
a.&b
|
|
|
|
var obj = Object.new|;
|
|
function obj.f() { 24 }|;
|
|
|
|
|
|
var f = function(a, b) {
|
|
echo(b + a);
|
|
}|
|
|
f(1, 0);
|
|
|
|
|
|
function g3()
|
|
{
|
|
return; // Stop execution at this point and return void
|
|
echo(0); // This is not executed
|
|
}|
|
|
|
|
Object.setProperty, to define/set a property.
|
|
Object.getProperty, to get a property.
|
|
Object.removeProperty, to delete a property.
|
|
Object.hasProperty, to test for the existence of a property.
|
|
Object.properties, to get all the properties of a slot.
|
|
|
|
enum Suit
|
|
{
|
|
hearts,
|
|
diamonds,
|
|
clubs,
|
|
spades, // Last comma is optional
|
|
};
|
|
|
|
for (var suit in Suit)
|
|
echo("%s the ace of %s." % [find_ace(suit), suit]);
|
|
|
|
switch ( ("foo", [1, 2]) )
|
|
{
|
|
// The pattern does not match the values of the list.
|
|
case ("foo", [2, 1]):
|
|
echo("fail");
|
|
|
|
// The pattern does not match the tuple.
|
|
case ["foo", [1, 2]]:
|
|
echo("fail");
|
|
|
|
// The pattern matches and binds the variable "l"
|
|
// but the condition is not verified.
|
|
case ("foo", var l) if l.size == 0:
|
|
echo("fail");
|
|
|
|
// The pattern matches.
|
|
case ("foo", [var a, var b]):
|
|
echo("foo(%s, %s)" % [a, b]);
|
|
};
|
|
//[00000000] *** foo(1, 2)
|
|
|
|
{
|
|
["b" => var b, "a" => var a] = ["a" => 1, "b" => 2, "c" => 3];
|
|
echo("a = %d, b = %d" % [a, b]);
|
|
};
|
|
//[00000000] *** a = 1, b = 2
|
|
|
|
|
|
switch (["speed" => 2, "time" => 6s])
|
|
{
|
|
case ["speed" => var s] if s > 3:
|
|
echo("Too fast");
|
|
case ["speed" => var s, "time" => var t] if s * t > 10:
|
|
echo("Too far");
|
|
};
|
|
//[00000000] *** Too far
|
|
|
|
|
|
try
|
|
{
|
|
throw ("message", 0)
|
|
}
|
|
catch (var e if e.isA(Exception))
|
|
{
|
|
echo(e.message)
|
|
}
|
|
catch ((var msg, var value) if value.isA(Float))
|
|
{
|
|
echo("%s: %d" % [msg, value])
|
|
};
|
|
//[00000000] *** message: 0
|
|
|
|
|
|
{
|
|
var e = Event.new;
|
|
at (e?(var msg, var value) if value % 2 == 0)
|
|
echo("%s: %d" % [msg, value]);
|
|
|
|
// Does not trigger the "at" because the guard is not verified.
|
|
e!("message", 1);
|
|
|
|
// Trigger the "at".
|
|
e!("message", 2);
|
|
};
|
|
//[00000000] *** message: 2
|
|
|
|
for (var i = 0; i < 8; i++)
|
|
{
|
|
if (i % 2 != 0)
|
|
continue;
|
|
echo(i);
|
|
};
|
|
|
|
do (1024)
|
|
{
|
|
assert(this == 1024);
|
|
assert(sqrt == 32);
|
|
setSlot("y", 23);
|
|
}.y;
|
|
|
|
{
|
|
var n = 10|;
|
|
var res = []|;
|
|
loop;{
|
|
n--;
|
|
res << n;
|
|
if (n == 0)
|
|
break
|
|
};
|
|
res
|
|
}
|
|
|
|
|
|
{
|
|
var n = 10|;
|
|
var res = []|;
|
|
loop|{
|
|
n--;
|
|
res << n;
|
|
if (n == 0)
|
|
break
|
|
};
|
|
res
|
|
}
|
|
|
|
|
|
var j = 3|
|
|
while (0 < j)
|
|
{
|
|
echo(j);
|
|
j--;
|
|
};
|
|
|
|
|
|
{
|
|
var i = 4|
|
|
while| (true)
|
|
{
|
|
i -= 1;
|
|
echo ("in: " + i);
|
|
if (i == 1)
|
|
break
|
|
else if (i == 2)
|
|
continue;
|
|
echo ("out: " + i);
|
|
};
|
|
};
|
|
|
|
|
|
|
|
function test(e)
|
|
{
|
|
try
|
|
{ throw e; }
|
|
catch (0)
|
|
{ echo("zero") }
|
|
catch ([var x, var y])
|
|
{ echo(x + y) }
|
|
} | {};
|
|
|
|
try { echo("try") }
|
|
catch { echo("catch")}
|
|
else { echo("else")};
|
|
|
|
|
|
try
|
|
{
|
|
echo("inside");
|
|
}
|
|
finally
|
|
{
|
|
echo("finally");
|
|
};
|
|
//[00000001] *** inside
|
|
//[00000002] *** finally
|
|
|
|
at (e?(var start) ~ 1s)
|
|
echo("in : %s" % (time - start).round)
|
|
onleave
|
|
echo("out: %s" % (time - start).round);
|
|
|
|
// This emission is too short to trigger the at.
|
|
e!(time);
|
|
|
|
// This one is long enough.
|
|
// The body triggers 1s after the emission started.
|
|
e!(time) ~ 2s;
|
|
//[00001000] *** in : 1
|
|
//[00002000] *** out: 2
|
|
|
|
|
|
timeout (2.1s)
|
|
every (1s)
|
|
echo("Are you still there?");
|
|
//[00000000] *** Are you still there?
|
|
//[00001000] *** Are you still there?
|
|
//[00002000] *** Are you still there?
|
|
|
|
every| (1s)
|
|
{
|
|
echo("aba");
|
|
};
|
|
|
|
for, (var i = 3; 0 < i; i -= 1)
|
|
{
|
|
echo (i);
|
|
};
|
|
|
|
|
|
for& (var i: [0, 1, 2])
|
|
{
|
|
echo (i * i);
|
|
};
|
|
|
|
loop,{
|
|
};
|
|
|
|
|
|
waituntil (e?(1, var b));
|
|
|
|
whenever (e?("arg", var arg) if arg % 2)
|
|
echo("e (%s) on" % arg)
|
|
else
|
|
echo("e off");
|
|
|
|
|
|
while, (i)
|
|
{
|
|
var j = i -= 1;
|
|
}|
|
|
|
|
|
|
var y = 0;
|
|
{
|
|
sleep(0.5s);
|
|
y = 100 smooth:3s,
|
|
},
|
|
|
|
|
|
|
|
|