# Sourcecode Examples

#* * Examples of how to use bitwise operators *# # Prints "01\n" assert 0 == (put 1 and 0); assert 1 == (say 1 and 1); # Prints "01\n" assert 0 == (put 0 or 0); assert 1 == (say 0 or 1); # Prints "01\n" assert 0 == (put 1 xor 1); assert 1 == (say 1 xor 0); # Prints "82\n" assert 8 == (put 2 :< 2); assert 2 == (say 8 :> 2); # A bit more complex, prints "9\n" assert 9 == (say 1 :< 5 :> 5 or 2 and 5 xor 8); # Same result, but with parenthesis: assert 9 == (say ((((1 :< 5) :> 5) or 2) and 5) xor 8); # Different parenthesis, different result: "1\n" assert 1 == (say 1 :< 5 :> 5 or 2 and (5 xor 8)); # Prints "-1" assert (neg 1) == (say neg not 0); #* * Simple examples how to write comments *# # This is a single lined comment say 1 + 1; # This is a comment at the end of the line say 1 #* This is an embedded comment *# + 1; #* This is a multiline comment *# #* * This is * a nicer looking * multiline comment *# #* * Simple conditional tests *# # "0010\n" assert 0 == (put 1 < 1); assert 0 == (put 1 < 0); assert 1 == (put 0 < 1); assert 0 == (say 0 < 0); # "0100\n" assert 0 == (put 1 > 1); assert 1 == (put 1 > 0); assert 0 == (put 0 > 1); assert 0 == (say 0 > 0); # "1001\n" assert 1 == (put 1 == 1); assert 0 == (put 1 == 0); assert 0 == (put 0 == 1); assert 1 == (say 0 == 0); # "0110\n" assert 0 == (put 1 != 1); assert 1 == (put 1 != 0); assert 1 == (put 0 != 1); assert 0 == (say 0 != 0); # "1011\n" assert 1 == (put 1 <= 1); assert 0 == (put 1 <= 0); assert 1 == (put 0 <= 1); assert 1 == (say 0 <= 0); ## "1101\n" assert 1 == (put 1 >= 1); assert 1 == (put 1 >= 0); assert 0 == (put 0 >= 1); assert 1 == (say 0 >= 0); #* * Examples of how to use control statements *# if 1 { say "if 1"; } ifnot 0 == 1 { say "ifnot 0 == 1"; } # Calculate 10! my n = 10, fac = 0; while n > 1 { ifnot fac { fac = 1; } say fac = (fac * n); decr n; } # Count up to 10 n = 0; until n == 10 { say incr n; } #* * Simple expression tests *# # Result 10 assert 10 == say (8 / 2) + 2 * 3; # Result 12 assert 12 == say 2 * (4 + 2); # Result 4 assert 4 == say 2 * (4 / 2); # Result 4 assert 4 == say 2 * (4 / 2); # Result 4 assert 4 == say 2 * (4 / 2); # Result 46 assert 46 == say "12" + "34"; # Result 1231 assert 1231 == say "1234" - "3"; # Result 24 assert "24" == say "2ab" * "12"; # Result 5.0 assert 5 == say "10 bla" / 2; #* * Examples of how to use fork *# my pid = fork; if pid { put "I am the parent process and the child has the pid "; say pid; } ifnot pid { say "I am the child process"; } #* * Examples of how to use functions *# func foo { say 1 + a * 3 + b; func bar { say "Hello i am nested"; } bar; # Calling nested } my a = 2, b = 4; # Create global variables foo; assert 0 == (defined bar); # bar is not available anymore func baz { say "I am baz"; undef baz; } baz; # Baz deletes itself assert 0 == (defined baz); # baz is not available anymore #* * Simple builtin function tests *# # Print "-20\n" assert (neg 20) == (say neg 20); # Print "30\n" assert 30 == (say 10 - neg 20); # Print "-30\n" assert (neg 30) == (say neg neg neg 10 - neg 20); # Print "Hello\n" put "Hello"; ln; # Exit with exit code 0 exit 10 + 10 - 5 - 15; #* * Simple I/O examples. Currently only output is supported. *# # Print out 10 followed by a newline say 10; # Print out 20 without a newline followed put 20; # Print out a newline ln; #* * Examples of how to use procedures *# proc foo { say 1 + a * 3 + b; my c = 6; } my a = 2, b = 4; foo; # Run the procedure. Print out "11\n" say c; # Print out "6\n"; proc bar { say "I am bar"; undef baz; proc baz { say "I am baz"; } } # Here bar would produce an error because the proc is not yet defined! # bar; bar; # Here the procedure bar will define the procedure baz! baz; # Now the procedure baz is defined! bar; # Here the procedure bar will redefine baz again! #* * Examples of how to use scopeing *# my foo = 1; { # Prints out 1 assert 1 == (put defined foo); { my bar = 2; # Prints out 1 assert 1 == (put defined bar); # Prints out all available symbols at # the current program position. scope; } # Prints out 0 assert 0 == (put defined bar); my baz = 3; } # Prints out 0 assert 0 == (say defined bar); #* * Examples of how to use synonyms *# # Create a variable foo, and bar is a synonym for foo my foo = "foo"; my bar = \foo; # Reset the value of foo foo = "bar"; # The synonym variable should now also set to "bar" assert "bar" == say bar; # Create a new procedure baz proc baz { say "I am baz"; } # Make a synonym baz, and undefine baz my bay = \baz; # Should be the num of syms for the same value assert 2 == syms baz; assert 2 == syms bay; undef baz; assert 1 == syms bay; # bay still has a reference of the original procedure baz bay; # this prints aut "I am baz" assert 0 == defined baz; assert 1 == defined bay; # This removes the procedure from memory undef bay; #* * Examples how to convert types *# assert 1 == say 1; # Integer output assert 1 == say double 1; # Double output assert 14 == say 1 + string 13; # Implicit type conversion to Integer assert 2 == say integer 2.8; # Rounds down to the Integer 2 assert say integer double string put say neg 12; # Nonsense but working :) #* * Examples of how to define variables *# # Defines the variables my foo = 1 + 1; my bar = 4 - 1, baz = 100 + 1, bay; # bay has been initialized with the default value of 0 say bay; # Prints out "5\n" assert 5 == (say foo + bar); # Pritns out "51101\n" assert 51 == (put baz - 50); assert 101 == (say baz); # Change the value of the variable to 99 and print it out assert 99 == (baz = 99); say baz;