japl/examples/syntax.jpl

140 lines
2.4 KiB
Plaintext

// Example file to test JAPL's syntax
// Mathematical expressions
2 + 2;
-1 * 6;
3 * (9 / 2); // Parentheses for grouping
8 % 2; // Modulo division
6 ** 9; // Exponentiation
~5; // Binary NOT
2 ^ 5; // XOR
3 & 9; // AND
9 | 3; // OR
// Variable definition and assignment
var name = "bob"; // Dynamically typed
name = "joe"; // Can only be assigned if it's defined
del name; // Delete a variable
var foo; // Unitialized variables are equal to nil
// Scoping
var a = "global";
var b = "global1";
{ // open a new scope
var b = "local"; // Shadow the global variable
print(a); // This falls back to the global scope
print(b);
}
print(a);
print(b); // The outer scope isn't affected
/*
A multiline comment
yay!
*/
// Control flow statements
var n = 0;
while (n <= 10) { // While loops
if (n <= 5) { // If statements
print(n);
}
n = n + 1;
}
for (var i = 0; i < 10; i = i + 1) { // For loops
print(i);
}
// Functions
print(clock()); // Function calls
fun count(n) { // Function definitions
if (n > 1) count(n - 1); // Recursion works
print(n);
}
count(3);
// Closures work too!
var a = "global";
{
fun showA() {
print(a);
}
showA();
var a = "block";
showA();
}
// Nested functions
fun makeCounter() {
var i = 0;
fun count() {
i = i + 1;
print(i);
}
return count;
}
var counter = makeCounter();
counter(); // "1".
counter(); // "2".
// Classes
class Person {
init(name) { // Class initializer
this.name = name;
}
greet() { // Methods don't use the 'fun' keyword!
print("Hello, " + this.name); // this refers to the current instance
}
}
var bob = Person("Bob"); // Object creation
bob.greet(); // Prints Hello, Bob
var greetbob = bob.greet; // Functions and methods are first-class objects! (classes are too)
greetbob();
class Male < Person { // Male inherits from person
init(name) {
super.init(name); // Inherits constructor behavior
this.sex = "male";
}
greet() {
super.greet(); // Inherits behavior from superclass
}
}
var mark = Male("Mark");
mark.greet();
// Strings
"string slicing!"[0]; // 0-indexed
"ranges work too"[0:5];
"implicit end"[3:]; // Ends at the end of the string
"implicit start"[:5]; // From 0 to 5
"hello" + " world"; // Strings are immutable!
"hello" * 3; //hellohellohello