This is a page of sample code, showing basic non-relational capabilities. It will be part of the download, when available.
// Andl samples -- scalar // Aim is to show an example of every feature // Also useful as a quick smoke test //=== Tokens === // A free expression is evaluated immediately 'hello world!' // Single and double quoted strings are concatenated immediately "Hel""lo" ' World' "!" // d-string is decimal Unicode char "Hello" & d'32 87' & "orld" // h-string is hex Unicode char "Hello" & h'20 57' & "orld" // t-string is a Time t'2015/12/31' // i-string is an identifier i'x( )' := 'hello world!' i'x(' h'20' ')' //=== Expressions === // Logical: all true true = not false 3 <> 4 'ABC' > 'abc' t'2015/12/31' < t'01/01/2016' 'Z' >= 'A' and (3<=4 or (true xor false)) // Numeric: all 42 5-8*6/4+7**2 (58 div 8) * (86 mod 8) (9 or 7) and (9 xor 3) xor 32 // String: mostly Hello World! 'Hello' & " " & 'World!' trim('Hello ') & ' ' & trim(' World') & trim(' ! ') fill(' ',10) & fill('Hello Planet???', 5) & fill(' World!', 35) before(after("@@@>>>Hello World!<<<@@@", '>>>'), '<<<') toupper('h') & tolower('ELLO') & toupper(' w') & tolower('ORLD!') // String: other 'hello'.length = length('world') "Interpolate date: " & t'2015/12/31' & " number:" & 12345 & " logical:" & (2=2) // Date: d1 := dateymd(2015,1,31) "Date: " & d1 & " Year:" & d1.year & " month:" & d1.month & " day:" & d1.day & " dow:" & d1.dow // Special: if(), only evaluates one of its arguments if(true,'Hello World!', "goodbye!") if(2>2,1/0, 7*6) //=== Statements === // Assignment -- evaluated once v1 := 'Hello World!' v1 // Assignment to out sends direct to output out := v1 // Deferred assignment -- evaluated every time v2 => v1 v2 // do block creates a local scope and returns value of last expression (statement returns void) do { v2 := v1 v2 } // Deferred evaluation wiht do block v3 => do { v2 := v1 v2 } v3 // Deferred evaluation with do block and arguments v4(a) => do { v2 := a v2 } // Arguments with literal types (default is text) v5(a:'',b:0,c:false,d:d1) => do { a & b & c & d } v5(v1,42,true,dateymd(2015,1,1)) // Arguments with named types v6(a:text,b:number,c:bool,d:date) => do { a & b & c & d } v6(v1,42,true,dateymd(2015,1,1)) // Recursion, function name must be typed fact:0(n:0) => if(n<=1,1,n*fact(n-1)) fact(20) // ===== Types ===== u1 := ut1 { n:=42, t:=v1, d:= d1 } "n:" & u1.n & " t:" & u1.t & " d:" & u1.d u2 := ut1 { n:=41, t:="!"&v1, d:= dateymd(d1.year+1,d1.month,d1.day) } "n:" & u2.n & " t:" & u2.t & " d:" & u2.d // Comparison left-to-right u1 > u2 // Deferred function f7(u:ut1) => do { "n:" & u.n & " t:" & u.t & " d:" & u.d } f7(u1) f7(u2) // done