// 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, },