Elan Library Reference

Value data Types

Integer

An integer is a whole number, i.e. one that has no fractional part. It may be represented in decimal, hexadecimal or binary:

100 (decimal), 0x64 (hexadecimal) and 0b1100100 all have the same value.

Its type is IntintintIntegerint.

name
of Type
examples of defining
a literal value
IntintintIntegerint +constant maxNumbername? set to 10literal value or data structure?1+maxNumbername? = 10literal value or data structure? # constant1+const Int maxNumbername? = 10literal value or data structure?;1+Const maxNumbername? = 10literal value or data structure?1
public class Global {

+final Int maxNumbername? = 10literal value or data structure?; // constant1
}
IntintintIntegerint variable flagsname? set to 0b1100100value or expression?0flagsname? = 0b1100100value or expression? # variable definition0var flagsname? = 0b1100100value or expression?;0Dim flagsname? = &B1100100value or expression? ' variable definition0var flagsname? = 0b1100100value or expression?;0

Function dot methods on an IntintintIntegerint

function
dot method
argument
Types
return
Type
returns
asBinary (none) StringstrstringStringString string of binary digits representing the argument's integer value
equals IntintintIntegerint BooleanboolboolBooleanbool true if integer and argument values are equal
false otherwise
notEqualTo IntintintIntegerint BooleanboolboolBooleanbool true if integer and argument values are unequal
false otherwise
toString (none) StringstrstringStringString a string of decimal digits representing the argument's integer value

Notes

Example of large numbers

   ● This code calculates 2 raised to the power of 50 through 72, and its output is shown below:

+main 1 +for nitem? in range(50, 73)source? 2 variable npname? set to pow(2, n).floor()value or expression?3 call printTabprocedureName?(n.toString().length(), $"{n}"arguments?)4 call printTabprocedureName?(30 - np.toString().length(), $"{np}\n"arguments?)5 end for end main
+def main() -> None: 1 +for nitem? in range(50, 73)source?: 2 npname? = pow(2, n).floor()value or expression? # variable definition3 printTabprocedureName?(n.toString().length(), f"{n}"arguments?) # call procedure4 printTabprocedureName?(30 - np.toString().length(), f"{np}\n"arguments?) # call procedure5 main()
+static void main() { 1 +foreach (nitem? in range(50, 73)source?) { 2 var npname? = pow(2, n).floor()value or expression?;3 printTabprocedureName?(n.toString().length(), $"{n}"arguments?); // call procedure4 printTabprocedureName?(30 - np.toString().length(), $"{np}\n"arguments?); // call procedure5 } // foreach } // main
+Sub main() 1 +For Each nitem? In range(50, 73)source? 2 Dim npname? = pow(2, n).floor()value or expression? ' variable definition3 printTabprocedureName?(n.toString().length(), $"{n}"arguments?) ' call procedure4 printTabprocedureName?(30 - np.toString().length(), $"{np}\n"arguments?) ' call procedure5 Next n End Sub
public class Global {

+static void main() { 1 +foreach (nitem? in range(50, 73)source?) { 2 var npname? = pow(2, n).floor()value or expression?;3 printTabprocedureName?(n.toString().length(), String.format("%", n)arguments?); // call procedure4 printTabprocedureName?(30 - np.toString().length(), String.format("%\n", np)arguments?); // call procedure5 } // foreach } // main
}

big integers


Floating point

A floating point number is a decimal number (also known as a Real number) that may have both integer and fractional parts.

It may be written using exponential (scientific) notation, e.g. 120.0 can be written as 1.20e2, and 0.012 as 1.20e-2

Its type is FloatfloatdoubleDoubledouble.
name
of Type
examples of defining
a literal value
FloatfloatdoubleDoubledouble +constant phiname? set to 1.618033988749895literal value or data structure?1+phiname? = 1.618033988749895literal value or data structure? # constant1+const Float phiname? = 1.618033988749895literal value or data structure?;1+Const phiname? = 1.618033988749895literal value or data structure?1
public class Global {

+final Float phiname? = 1.618033988749895literal value or data structure?; // constant1
}
FloatfloatdoubleDoubledouble variable readingname? set to 1.1e-10value or expression?0readingname? = 1.1e-10value or expression? # variable definition0var readingname? = 1.1e-10value or expression?;0Dim readingname? = 1.1e-10value or expression? ' variable definition0var readingname? = 1.1e-10value or expression?;0

Function dot methods on a FloatfloatdoubleDoubledouble

function
dot method
argument
Types
return
Type
returns
ceiling (none) IntintintIntegerint the first integral value larger than or equal to the argument's
floating point value
equals FloatfloatdoubleDoubledouble BooleanboolboolBooleanbool true if floating point number and argument values are equal
false otherwise
floor (none) IntintintIntegerint the first integral value smaller than or equal to the argument's
floating point value
isInfinite (none) BooleanboolboolBooleanbool true if value would be infinite, e.g. after division by zero
false otherwise
isNaN (none) BooleanboolboolBooleanbool true if value is 'NaN', i.e. Not a Number, e.g. 0/0
false otherwise
notEqualTo FloatfloatdoubleDoubledouble BooleanboolboolBooleanbool true if floating point number and argument values are unequal
false otherwise
round IntintintIntegerint FloatfloatdoubleDoubledouble the value rounded (up or down as appropriate) to the
number of decimal places specified in the argument
toString (none) StringstrstringStringString a string representing the argument's floating point value

Notes

Examples of standalone dot methods on a FloatfloatdoubleDoubledouble

   ● Test assertions using dot methods on a FloatfloatdoubleDoubledouble:

+test test_floortest_name? 1 variable pname? set to pivalue or expression?2 variable mpname? set to -pivalue or expression?3 assert p.floor()actual (computed) value? is 3expected value? not run4 assert mp.floor()actual (computed) value? is -4expected value? not run5 assert p.ceiling()actual (computed) value? is 4expected value? not run6 assert mp.ceiling()actual (computed) value? is -3expected value? not run7 assert p.round(3)actual (computed) value? is 3.142expected value? not run8 assert mp.round(2)actual (computed) value? is -3.14expected value? not run9 assert sqrt(-p).isNaN()actual (computed) value? is trueexpected value? not run10 variable qname? set to divAsInt(1, 0).floor()value or expression?11 assert q.isInfinite()actual (computed) value? is trueexpected value? not run12 end test
+def test_floortest_name?(self) -> None: 1 pname? = pivalue or expression? # variable definition2 mpname? = -pivalue or expression? # variable definition3 self.assertEqual(p.floor()actual (computed) value?, 3expected value?) not run4 self.assertEqual(mp.floor()actual (computed) value?, -4expected value?) not run5 self.assertEqual(p.ceiling()actual (computed) value?, 4expected value?) not run6 self.assertEqual(mp.ceiling()actual (computed) value?, -3expected value?) not run7 self.assertEqual(p.round(3)actual (computed) value?, 3.142expected value?) not run8 self.assertEqual(mp.round(2)actual (computed) value?, -3.14expected value?) not run9 self.assertEqual(sqrt(-p).isNaN()actual (computed) value?, Trueexpected value?) not run10 qname? = divAsInt(1, 0).floor()value or expression? # variable definition11 self.assertEqual(q.isInfinite()actual (computed) value?, Trueexpected value?) not run12
+[TestMethod] static void test_floortest_name?() { 1 var pname? = pivalue or expression?;2 var mpname? = -pivalue or expression?;3 Assert.AreEqual(3expected value?, p.floor()actual (computed) value?); not run4 Assert.AreEqual(-4expected value?, mp.floor()actual (computed) value?); not run5 Assert.AreEqual(4expected value?, p.ceiling()actual (computed) value?); not run6 Assert.AreEqual(-3expected value?, mp.ceiling()actual (computed) value?); not run7 Assert.AreEqual(3.142expected value?, p.round(3)actual (computed) value?); not run8 Assert.AreEqual(-3.14expected value?, mp.round(2)actual (computed) value?); not run9 Assert.AreEqual(trueexpected value?, sqrt(-p).isNaN()actual (computed) value?); not run10 var qname? = divAsInt(1, 0).floor()value or expression?;11 Assert.AreEqual(trueexpected value?, q.isInfinite()actual (computed) value?); not run12 } // test
+<TestMethod> Sub test_floortest_name?() 1 Dim pname? = pivalue or expression? ' variable definition2 Dim mpname? = -pivalue or expression? ' variable definition3 Assert.AreEqual(3expected value?, p.floor()actual (computed) value?) not run4 Assert.AreEqual(-4expected value?, mp.floor()actual (computed) value?) not run5 Assert.AreEqual(4expected value?, p.ceiling()actual (computed) value?) not run6 Assert.AreEqual(-3expected value?, mp.ceiling()actual (computed) value?) not run7 Assert.AreEqual(3.142expected value?, p.round(3)actual (computed) value?) not run8 Assert.AreEqual(-3.14expected value?, mp.round(2)actual (computed) value?) not run9 Assert.AreEqual(Trueexpected value?, sqrt(-p).isNaN()actual (computed) value?) not run10 Dim qname? = divAsInt(1, 0).floor()value or expression? ' variable definition11 Assert.AreEqual(Trueexpected value?, q.isInfinite()actual (computed) value?) not run12 End Sub
public class Global {

+@Test static void test_floortest_name?() { 1 var pname? = pivalue or expression?;2 var mpname? = -pivalue or expression?;3 assertEquals(3expected value?, p.floor()actual (computed) value?); not run4 assertEquals(-4expected value?, mp.floor()actual (computed) value?); not run5 assertEquals(4expected value?, p.ceiling()actual (computed) value?); not run6 assertEquals(-3expected value?, mp.ceiling()actual (computed) value?); not run7 assertEquals(3.142expected value?, p.round(3)actual (computed) value?); not run8 assertEquals(-3.14expected value?, mp.round(2)actual (computed) value?); not run9 assertEquals(trueexpected value?, sqrt(-p).isNaN()actual (computed) value?); not run10 var qname? = divAsInt(1, 0).floor()value or expression?;11 assertEquals(trueexpected value?, q.isInfinite()actual (computed) value?); not run12 } // test
}

Boolean

A Boolean value is either true or false.

The words true and false must be written in lower case.

name
of Type
examples of defining
a literal value
BooleanboolboolBooleanbool variable donename? set to truevalue or expression?0donename? = Truevalue or expression? # variable definition0var donename? = truevalue or expression?;0Dim donename? = Truevalue or expression? ' variable definition0var donename? = truevalue or expression?;0

Function dot methods on a BooleanboolboolBooleanbool

function
dot methods
argument
Types
return
Type
returns
equals BooleanboolboolBooleanbool BooleanboolboolBooleanbool true if the truth value and argument are equal
false otherwise
notEqualTo BooleanboolboolBooleanbool BooleanboolboolBooleanbool true if the truth value and argument are unequal
false otherwise
toString (none) StringstrstringStringString String "true" if true,
"false" if false

Reference data Types

String

A StringstrstringStringString represents text, i.e. a sequence of zero or more characters.

name
of Type
examples of defining
a literal value
details
StringstrstringStringString +constant titlename? set to "Ulysses"literal value or data structure?1+titlename? = "Ulysses"literal value or data structure? # constant1+const String titlename? = "Ulysses"literal value or data structure?;1+Const titlename? = "Ulysses"literal value or data structure?1
public class Global {

+final String titlename? = "Ulysses"literal value or data structure?; // constant1
}
delimited by double quotes
StringstrstringStringString variable quotename? set to "'Hello', she said"value or expression?0quotename? = "'Hello', she said"value or expression? # variable definition0var quotename? = "'Hello', she said"value or expression?;0Dim quotename? = "'Hello', she said"value or expression? ' variable definition0var quotename? = "'Hello', she said"value or expression?;0 ' may be used in a string delimited by "
StringstrstringStringString variable emptyStringname? set to ""value or expression?0emptyStringname? = ""value or expression? # variable definition0var emptyStringname? = ""value or expression?;0Dim emptyStringname? = ""value or expression? ' variable definition0var emptyStringname? = ""value or expression?;0 a zero-length, or 'empty', string

Character sets

When typing from the keyboard into a literal string all the basic ASCII characters (0x20 to 0x7e) and '£' can be input.

You cannot use Alt+numeric-keypad to enter accented letters or other special characters in the extended ASCII range (0x80 to 0xff).

You can, however, copy any text from outside Elan and paste it into a string, whether ASCII, extended ASCII or UTF-8 encoded.

To insert a character from the full range, you use its Unicode (codepoint) value, in decimal or hexadecimal, by means of function unicode :

print($"Spanish introduces a question with {unicode(191)}"arguments?)0
print(f"Spanish introduces a question with {unicode(191)}"arguments?)0
Console.WriteLine($"Spanish introduces a question with {unicode(191)}"arguments?); // print0
Console.WriteLine($"Spanish introduces a question with {unicode(191)}"arguments?) ' print0
System.out.println(String.format("Spanish introduces a question with %", unicode(191))arguments?); // print0
Spanish introduces a question with ¿
print($"This is an up arrow: {unicode(0x2191)}"arguments?)0
print(f"This is an up arrow: {unicode(0x2191)}"arguments?)0
Console.WriteLine($"This is an up arrow: {unicode(0x2191)}"arguments?); // print0
Console.WriteLine($"This is an up arrow: {unicode(&H2191)}"arguments?) ' print0
System.out.println(String.format("This is an up arrow: %", unicode(0x2191))arguments?); // print0
This is an up arrow: ↑

These examples 'interpolate' the output of function unicode by using a $ before the string and curly braces within it (see Interpolated fields ).

Manipulating strings

Strings can be built from other strings by concatenation using the plus operator, for example:

print("Hello " + "world"arguments?)0print("Hello " + "world"arguments?)0Console.WriteLine("Hello " + "world"arguments?); // print0Console.WriteLine("Hello " + "world"arguments?) ' print0System.out.println("Hello " + "world"arguments?); // print0 Hello world

A newline may be inserted within a string with \n:

print("Hello\nworld"arguments?)0print("Hello\nworld"arguments?)0Console.WriteLine("Hello\nworld"arguments?); // print0Console.WriteLine("Hello\nworld"arguments?) ' print0System.out.println("Hello\nworld"arguments?); // print0Hello
world

When editing and you leave the field, the newline will be implicitly applied in your code.

As in most languages, strings are immutable. When you apply any operation or function with the intent of modifying an existing StringstrstringStringString, the existing StringstrstringStringString is never changed. Instead, the operation or function will return a new StringstrstringStringString that is based on the original, but with the specified differences.

You can loop through a StringstrstringStringString picking each of its characters sequentially using the for loop .

Function dot methods on a String

function
dot method
argument
Types
return
Type
returns
asRegExp (none) RegExpRegExpRegExpRegExpRegExp a new string that is a a converted to a regular expression:
no check is made of whether the result is a valid regular expression
asUnicode (none) IntintintIntegerint the Unicode value of the first character of the string
(To convert a Unicode value into a string, use function unicode )
contains (none) BooleanboolboolBooleanbool true if the string contains the substring specified as the argument
false otherwise
equals StringstrstringStringString BooleanboolboolBooleanbool true if the string and argument are equal
false otherwise
notEqualTo StringstrstringStringString BooleanboolboolBooleanbool true if the string and argument are unequal
false otherwise
indexOf StringstrstringStringString IntintintIntegerint index of the first instance of the argument (substring) within the string
If it is not present, -1 is returned
isAfter StringstrstringStringString BooleanboolboolBooleanbool true if alphabetic comparison finds the string comes strictly 'after' the argument string
false otherwise
isAfterOrSameAs StringstrstringStringString BooleanboolboolBooleanbool true if alphabetic comparison finds the string comes 'after' or equals the argument string
false otherwise
isBefore StringstrstringStringString BooleanboolboolBooleanbool true if alphabetic comparison finds the string comes strictly 'before' the argument string
false otherwise
isBeforeOrSameAs StringstrstringStringString BooleanboolboolBooleanbool true if alphabetic comparison finds the string comes 'before' or equals the argument string
false otherwise
length (none) IntintintIntegerint the number of characters in the string
lowerCase (none) StringstrstringStringString a new string with the original rendered in lower case
matchesRegExp RegExpRegExpRegExpRegExpRegExp BooleanboolboolBooleanbool true if the string matches the regular expression
false otherwise
replace StringstrstringStringString, StringstrstringStringString StringstrstringStringString a new string with all occurrences of the first argument string replaced by the second argument string
split StringstrstringStringString
List<of String>
list[str]
List<string>
List(Of String)
List<String>
a ListlistListListList of the substrings found between occurrences of the argument string
if the argument is the empty string then the list is of all the individual characters
subString IntintintIntegerint, IntintintIntegerint StringstrstringStringString a new string that is the substring specified by the two positive integers (m,n) where
m indexes the first character of the substring required (counting from 0) and
n indexes the character after the last character required (exclusive index)
if mn the result is the empty string
toString (none) StringstrstringStringString the string itself
trim (none) StringstrstringStringString a new string with leading and trailing spaces removed
upperCase (none) StringstrstringStringString a new string with the original rendered in upper case

Interpolated fields in strings

Strings support interpolation, that is you can insert the values of variables or simple expressions within the string by enclosing them in curly braces and prefixing the string with a $:

If aaaaa and bbbbb have values 3 and 17:

print($"{a} times {b} equals {a*b}"arguments?)0
print(f"{a} times {b} equals {a*b}"arguments?)0
Console.WriteLine($"{a} times {b} equals {a*b}"arguments?); // print0
Console.WriteLine($"{a} times {b} equals {a*b}"arguments?) ' print0
System.out.println(String.format("% times % equals %", a, b, a*b)arguments?); // print0
3 times 17 equals 51

If velocityvelocityvelocityvelocityvelocity and fuelfuelfuelfuelfuel have values 3.0 and 50.4:

reassign messagevariableName? to $"LANDED SAFELY AT SPEED {(velocity*100).floor()} FUEL {fuel.floor()}"value or expression?0
messagevariableName? = f"LANDED SAFELY AT SPEED {(velocity*100).floor()} FUEL {fuel.floor()}"value or expression? # reassign variable0
messagevariableName? = $"LANDED SAFELY AT SPEED {(velocity*100).floor()} FUEL {fuel.floor()}"value or expression?; // reassign variable0
messagevariableName? = $"LANDED SAFELY AT SPEED {(velocity*100).floor()} FUEL {fuel.floor()}"value or expression? ' reassign variable0
messagevariableName? = String.format("LANDED SAFELY AT SPEED % FUEL %", (velocity*100).floor(), fuel.floor())value or expression?; // reassign variable0
print(messagearguments?)0
print(messagearguments?)0
Console.WriteLine(messagearguments?); // print0
Console.WriteLine(messagearguments?) ' print0
System.out.println(messagearguments?); // print0
LANDED SAFELY AT SPEED 300 FUEL 50

And for the area of a circle:

+main 1 variable rname? set to 2.0value or expression?2 print($"area = {(pi*r*r).round(2)}"arguments?)3 end main
+def main() -> None: 1 rname? = 2.0value or expression? # variable definition2 print(f"area = {(pi*r*r).round(2)}"arguments?)3 main()
+static void main() { 1 var rname? = 2.0value or expression?;2 Console.WriteLine($"area = {(pi*r*r).round(2)}"arguments?); // print3 } // main
+Sub main() 1 Dim rname? = 2.0value or expression? ' variable definition2 Console.WriteLine($"area = {(pi*r*r).round(2)}"arguments?) ' print3 End Sub
public class Global {

+static void main() { 1 var rname? = 2.0value or expression?;2 System.out.println(String.format("area = %", (pi*r*r).round(2))arguments?); // print3 } // main
}




area = 12.57

Standard data structures

Elan has two mutable data structure Types ListlistListListList and DictionaryDictionaryDictionaryDictionaryDictionary, and three immutable data structure Types HashSetHashSetHashSetHashSetHashSet, StackStackStackStackStack and QueueQueueQueueQueueQueue.

The contents of these structures are referred to as items (or sometimes elements).

The values of items in a mutable structure may be changed directly by calling the various procedure dot methods defined for each structure Type.

The values of items in an immutable structure cannot be changed directly, and so have no procedure dot methods defined for them: rather, the methods called on them create new copies of the structures containing specified changes.

Since procedure methods may be called only from within the main routine or a procedure, it is also possible to make changes via function dot methods, which return a copy of the data structure with specified changes: that is why all such methods have names starting 'with'.

Immutable data structures are intended specifically to facilitate the Functional Programming paradigm, but some are also useful within other programming paradigms.

All six contain values (and keys in the case of a DictionaryDictionaryDictionaryDictionaryDictionary) of only a single Type, that type being specified either explicitly (as in <of IntintintIntegerint>), or implicitly if the structure is created using a literal definition.

This table summarises the creation and reference to these structures. Details of their methods follow.

List Dictionary HashSet Stack Queue
mutability Mutable Mutable Immutable Immutable Immutable
Type form ListlistListListList<of Type>
Type of item can be any, including ListlistListListList for 'jagged' data
DictionaryDictionaryDictionaryDictionaryDictionary<of keyType, valueType>
keyType is IntintintIntegerint, FloatfloatdoubleDoubledouble, StringstrstringStringString or BooleanboolboolBooleanbool
valueType may be any Type
HashSetHashSetHashSetHashSetHashSet<of Type>
Type of item must be immutable
StackStackStackStackStack<of Type>
Type of item must be immutable
QueueQueueQueueQueueQueue<of Type>
Type of item must be immutable
sizeDynamicDynamicDynamicDynamicDynamic
literal definition [2, 3, 5, 7, 11][2, 3, 5, 7, 11][2, 3, 5, 7, 11]{2, 3, 5, 7, 11}[2, 3, 5, 7, 11] ["a":3, "b":5]["a":3, "b":5]["a":3, "b":5]["a":3, "b":5]["a":3, "b":5] Only as converted from a literal ListlistListListList
e.g. ["a", "b", "c"].asSet()["a", "b", "c"].asSet()["a", "b", "c"].asSet(){"a", "b", "c"}.asSet()["a", "b", "c"].asSet()
Not available Not available
create empty new ListlistListListList<of Type>() new DictionaryDictionaryDictionaryDictionaryDictionary<of keyType, valueType>() new HashSetHashSetHashSetHashSetHashSet<of Type>() new StackStackStackStackStack<of Type>() new QueueQueueQueueQueueQueue<of Type>()
create initialised createList(number, value)createList(number, value)createList(number, value)createList(number, value)createList(number, value)
createListOfLists(cols, rows, value)createListOfLists(cols, rows, value)createListOfLists(cols, rows, value)createListOfLists(cols, rows, value)createListOfLists(cols, rows, value)
Not available Not available Not available Not available
read by index li[2]li[2]li[2]li[2]li[2] d["b"]d["b"]d["b"]d["b"]d["b"] not available not available not available
read by index range li.subList(3, 5)li.subList(3, 5)li.subList(3, 5)li.subList(3, 5)li.subList(3, 5)
lower bound is inclusive from 0
upper bound is exclusive
not available not available not available not available
procedure methods to mutate contents see Procedure methods on a List see Procedure methods on a Dictionary not available not available not available
function dot methods see Function dot methods on a List see Function dot methods on a Dictionary see Function dot methods on a Set see Function dot methods on a Stack see Function dot methods on a Queue

List

The ListlistListListList type defines a data structure containing n items of any single Type, including basic value Types, structure Types such as ListlistListListList, and user-defined Types such as a Class.

Items in a List of n items are indexed from 0 to n-1.

To create a List, use either of:

The item at index ix in List aList can then be changed using a reassign variable instruction and a valid index value in square brackets:

A List's size can be dynamically changed using the procedure methods listed below.

Deconstructing a List

A ListlistListListList may be split (deconstructed) into new named values using indexes and the methods head, tail and subList :

In all these cases the items indexed must exist, else a runtime error will stop the program.

Lists of lists

Two dimensional arrays

Understood as a grid, a 2D array is a List of 'columns' each of which is a List of 'row' items, i.e. it is a List of Lists in which the column number is the x coordinate, and the row number is the y coordinate.

To create a 2D array that holds a value of a single type in every cell, you define such a List of Lists thus:

The item at index ix,iy in a 2D array can be accessed and changed using its two coordinates in square brackets:

Higher dimensional arrays

For a 3D array, you can, for example, define:

and refer to a cell using three indexes in square brackets.

Procedure methods on a ListlistListListList

Where an argument provides a new value for an item in a List, that value must be of the same type as defined for the List's items.

procedure
method
arguments action
append value of ListlistListListList item's Type the item is added to the end of the List
appendList ListlistListListList the argument List is added to the end of the List
initialise IntintintIntegerint,
value of ListlistListListList item's Type
specify the number (> 0) of items in the List,
and an initial value for every item.
May be called at any time to redefine the List's size and initial values.
insert IntintintIntegerint,
value of ListlistListListList item's Type
the item is inserted at the index given.
If the index is negative it is counted from the end
If the index is greater than the list's length, the item is inserted at the end
prepend value of ListlistListListList item's Type the item is is added to the start of the List
prependList ListlistListListList the argument List is added to the start of the List
removeAll value of ListlistListListList item's Type delete all items equal to the given item
removeAt IntintintIntegerint delete the item at the argument index
removeFirst value of ListlistListListList item's Type delete the first item equal to the given value

Function dot methods on a ListlistListListList

function
dot method
arguments return
Type
returns
asSet (none) HashSetHashSetHashSetHashSetHashSet a new Set containing all the unique items in the List
contains value BooleanboolboolBooleanbool true if the List contains the specified item
false otherwise
equals ListlistListListList BooleanboolboolBooleanbool true if list and argument are identical
false otherwise
filter lambdalambdalambdalambdalambda ListlistListListList a new List obtained from applying a lambda to the input List
see filter in HoFs
head (none) ListlistListListList item's Type the first item of the List (i.e. index = 0, which must exist)
indexOf value of ListlistListListList item's Type IntintintIntegerint the index of the first occurrence of the argument value in the List,
or -1 if no match is found
join List<of String>list[str]List<string>List(Of String)List<String> StringstrstringStringString a single String that joins all the items in the list,
with the specified String (which can be empty) inserted between the items
length (none) IntintintIntegerint the number of items in the List
map lambdalambdalambdalambdalambda ListlistListListList a new List obtained from applying a lambda to the input List
see map in HoFs
maxBy lambdalambdalambdalambdalambda ListlistListListList item's Type the list item corresponding to the maximum of the values returned by a lambda
see maxBy in HoFs
minBy lambdalambdalambdalambdalambda ListlistListListList item's Type the list item corresponding to the minimum of the values returned by a lambda
see minBy in HoFs
notEqualTo ListlistListListList BooleanboolboolBooleanbool true if list and argument differ l
false otherwise
orderBy lambdalambdalambdalambdalambda ListlistListListList a new list with the items ordered according to the value returned by a lambda
reduce item of ListlistListListList item's Type,
lambdalambdalambdalambdalambda
return type of lambda the final value obtained by applying a lambda cumulatively to each item in the input List
taking account of the first argument as an initial (and default return) value
see reduce in HoFs
subList IntintintIntegerint, IntintintIntegerint ListlistListListList a new list that contains the items specified by the two positive integers (m,n) where
m indexes the first item of the list required (counting from 0) and
n indexes the item after the last item required (exclusive index)
if mn the result is the empty list
tail (none) ListlistListListList item's Type all items except the first item in the List (i.e. index = 1..n, which must exist)
toString (none) StringstrstringStringString a String that is a comma+space-separated list of the List's items, enclosed in square brackets
withAppend item of ListlistListListList item's Type ListlistListListList a new List lengthened with the item added after the end
withAppendList ListlistListListList of same Type ListlistListListList a new List lengthened by appending the given List
withInsert IntintintIntegerint,
value of ListlistListListList item's Type
ListlistListListList a new List with the item inserted after the item at the given index position
withPrepend value of ListlistListListList item's Type ListlistListListList a new List lengthened with the item added before the beginning
withPrependList ListlistListListList of same Type ListlistListListList a new List lengthened by prepending the given List
withRemoveAll value of ListlistListListList item's Type ListlistListListList a new List with items equal to the given item removed
withRemoveAt IntintintIntegerint ListlistListListList a new List with the item at the given index removed
withRemoveFirst value of ListlistListListList item's Type ListlistListListList a new List with the first item equal to the given item removed
withSet IntintintIntegerint,
value of ListlistListListList item's Type
ListlistListListList a new List with the item replacing that at the given index

Dictionary

A DictionaryDictionaryDictionaryDictionaryDictionary is like a List whose items are pairs but, instead of having a numeric index, each item has a key plus an associated value, i.e. a Dictionary is a set of key:value pairs.

The key's type must be one of IntintintIntegerint, FloatfloatdoubleDoubledouble, StringstrstringStringString or BooleanboolboolBooleanbool. The values may be of any Type. The Types of both keys and values are fixed when the Dictionary is created.

You refer to a dictionary item using one of its (unique) keys:

+main 1 variable di1name? set to ["alpha":1, "beta":2, "gamma":3]value or expression?2 print(di1["beta"]arguments?)3 variable di2name? set to [1:"alpha", 2:"beta", 3:"gamma"]value or expression?4 print(di2[3]arguments?)5 end main
+def main() -> None: 1 di1name? = ["alpha":1, "beta":2, "gamma":3]value or expression? # variable definition2 print(di1["beta"]arguments?)3 di2name? = [1:"alpha", 2:"beta", 3:"gamma"]value or expression? # variable definition4 print(di2[3]arguments?)5 main()
+static void main() { 1 var di1name? = ["alpha":1, "beta":2, "gamma":3]value or expression?;2 Console.WriteLine(di1["beta"]arguments?); // print3 var di2name? = [1:"alpha", 2:"beta", 3:"gamma"]value or expression?;4 Console.WriteLine(di2[3]arguments?); // print5 } // main
+Sub main() 1 Dim di1name? = ["alpha":1, "beta":2, "gamma":3]value or expression? ' variable definition2 Console.WriteLine(di1["beta"]arguments?) ' print3 Dim di2name? = [1:"alpha", 2:"beta", 3:"gamma"]value or expression? ' variable definition4 Console.WriteLine(di2[3]arguments?) ' print5 End Sub
public class Global {

+static void main() { 1 var di1name? = ["alpha":1, "beta":2, "gamma":3]value or expression?;2 System.out.println(di1["beta"]arguments?); // print3 var di2name? = [1:"alpha", 2:"beta", 3:"gamma"]value or expression?;4 System.out.println(di2[3]arguments?); // print5 } // main
}








2

gamma

Procedure method on a DictionaryDictionaryDictionaryDictionaryDictionary

procedure
method
argument
Types
action
removeAt key's Type delete the key:pair at the given key (if it exists)

Function dot methods on a DictionaryDictionaryDictionaryDictionaryDictionary

function
dot method
argument
Types
return
Type
returns
equals DictionaryDictionaryDictionaryDictionaryDictionary BooleanboolboolBooleanbool true if dictionary and argument are identical
false otherwise
hasKey item of Dictionary key's Type BooleanboolboolBooleanbool true if the Dictionary contains the given key
false otherwise
keys (none) ListlistListListList a List containing the keys
notEqualTo DictionaryDictionaryDictionaryDictionaryDictionary BooleanboolboolBooleanbool true if dictionary and argument differ
false otherwise
toString (none) StringstrstringStringString a string that is a comma+space-separated list of the Dictionary's key:value pairs, enclosed in square brackets
values (none) ListlistListListList a List containing the values
withSet item of Dictionary key's Type,
item of Dictionary value's Type
DictionaryDictionaryDictionaryDictionaryDictionary a new Dictionary with the value replacing what was at the specified key
withRemoveAt item of Dictionary key's Type DictionaryDictionaryDictionaryDictionaryDictionary a new Dictionary with the key:value pair removed from the specified key

HashSet

A HashSetHashSetHashSetHashSetHashSet (also referred to merely as a Set) is a standard data structure containing Set members, that works somewhat like a ListlistListListList with two important differences:

This enables a Set to work like a mathematical set so that it is possible to perform standard set operations such as union and intersection.

When creating a HashSetHashSetHashSetHashSetHashSet, the type of its members must be specified in the form HashSet<of String>HashSet[str]HashSet<string>HashSet(Of String)HashSet<String>

You can add members: either individually with add, or many with addFromList. And you can create a new HashSetHashSetHashSetHashSetHashSet from an existing ListlistListListList by calling asSet on it.

Example of creating a Set from a literal List and changing its content:

variable stname? set to new HashSet<of Int>()value or expression?0
stname? = HashSet[int]()value or expression? # variable definition0
var stname? = new HashSet<int>()value or expression?;0
Dim stname? = New HashSet(Of Integer)()value or expression? ' variable definition0
var stname? = new HashSet<int>()value or expression?;0




3
reassign stvariableName? to st.add(7)value or expression?0
stvariableName? = st.add(7)value or expression? # reassign variable0
stvariableName? = st.add(7)value or expression?; // reassign variable0
stvariableName? = st.add(7)value or expression? ' reassign variable0
stvariableName? = st.add(7)value or expression?; // reassign variable0


3
reassign stvariableName? to st.remove(3)value or expression?0
stvariableName? = st.remove(3)value or expression? # reassign variable0
stvariableName? = st.remove(3)value or expression?; // reassign variable0
stvariableName? = st.remove(3)value or expression? ' reassign variable0
stvariableName? = st.remove(3)value or expression?; // reassign variable0


2
reassign stvariableName? to st.remove(3)value or expression?0
stvariableName? = st.remove(3)value or expression? # reassign variable0
stvariableName? = st.remove(3)value or expression?; // reassign variable0
stvariableName? = st.remove(3)value or expression? ' reassign variable0
stvariableName? = st.remove(3)value or expression?; // reassign variable0


2
print(starguments?)0print(starguments?)0Console.WriteLine(starguments?); // print0Console.WriteLine(starguments?) ' print0System.out.println(starguments?); // print0 [5, 7]

Function dot methods on a HashSetHashSetHashSetHashSetHashSet

function
dot method
argument
Types
return
Type
returns
add value
(of HashSetHashSetHashSetHashSetHashSet members' Type)
HashSetHashSetHashSetHashSetHashSet a new Set extended with the item, provided it differs from all of the Set's current members
addFromList ListlistListListList HashSetHashSetHashSetHashSetHashSet a new Set extended with those items from the List that are not already in the Set
asList (none) ListlistListListList a List containing the Set's members as List items
contains value
(of HashSetHashSetHashSetHashSetHashSet members' Type)
BooleanboolboolBooleanbool true if the Set contains the item
false otherwise
difference HashSetHashSetHashSetHashSetHashSet HashSetHashSetHashSetHashSetHashSet a Set containing those members of the Set that do not occur in the argument Set
equals HashSetHashSetHashSetHashSetHashSet BooleanboolboolBooleanbool true if Set and argument Set contain identical values
false otherwise
notEqualTo HashSetHashSetHashSetHashSetHashSet BooleanboolboolBooleanbool true if Set and argument Set differ in their values
false otherwise
intersection HashSetHashSetHashSetHashSetHashSet HashSetHashSetHashSetHashSetHashSet a HashSet containing those members common to both the Set and the argument Set
isDisjointFrom HashSetHashSetHashSetHashSetHashSet BooleanboolboolBooleanbool true if the Set has no items in common with the argument Set
false otherwise
isSubsetOf HashSetHashSetHashSetHashSetHashSet BooleanboolboolBooleanbool true if all the Set's items are also in the argument Set
false otherwise
isSupersetOf HashSetHashSetHashSetHashSetHashSet BooleanboolboolBooleanbool true if the Set contains all the items that are in the argument Set
false otherwise
length (none) IntintintIntegerint the number of members of the Set
remove value
(of HashSetHashSetHashSetHashSetHashSet members' Type)
HashSetHashSetHashSetHashSetHashSet a new Set with the argument item removed (if present)
toString (none) StringstrstringStringString a string that is a comma+space-separated list of the Set's members, enclosed in brackets
union HashSetHashSetHashSetHashSetHashSet HashSetHashSetHashSetHashSetHashSet a Set containing all the unique members of the Set and the argument Set (i.e. no duplicates)

Stack and Queue

Function dot methods on a StackStackStackStackStack

function
dot method
argument
Types
return
Types
returns
equals StackStackStackStackStack BooleanboolboolBooleanbool true if stack and argument are identical
false otherwise
notEqualTo StackStackStackStackStack BooleanboolboolBooleanbool true if stack and argument differ
false otherwise
push value
(of StackStackStackStackStack item's Type)
StackStackStackStackStack the Stack with the value added to its top
pop (none) StackStackStackStackStack item,
StackStackStackStackStack
the topmost item of the Stack, and the Stack with the item removed
peek (none) StackStackStackStackStack item the topmost item on the Stack (without altering the Stack)
length (none) IntintintIntegerint the number of items in the Stack
toString (none) StringstrstringStringString a String that is a comma+space-separated list of the Stack's items, enclosed in square brackets,
the last item pushed being the first in the String

Function dot methods on a QueueQueueQueueQueueQueue

function
dot method
argument
Types
return
Types
returns
equals QueueQueueQueueQueueQueue BooleanboolboolBooleanbool true if queue and argument are identical
false otherwise
notEqualTo QueueQueueQueueQueueQueue BooleanboolboolBooleanbool true if queue and argument differ
false otherwise
enqueue value
(of QueueQueueQueueQueueQueue item's Type)
QueueQueueQueueQueueQueue the Queue with the item added to the end of the Queue
dequeue (none) QueueQueueQueueQueueQueue item,
QueueQueueQueueQueueQueue
the next item in the Queue, and the Queue with the item removed
peek (none) QueueQueueQueueQueueQueue item the next item in the Queue (without altering the Queue)
length (none) IntintintIntegerint the number of items in the Queue
toString (none) StringstrstringStringString a String that is a comma+space-separated list of the Queue's items, enclosed in square brackets,
the first item enqueued being the first in the String

Examples using StackStackStackStackStack and QueueQueueQueueQueueQueue

   ● Results of push and pop on strings in a StackStackStackStackStack:

+main 1 variable skname? set to new Stack<of String>()value or expression?2 print(sk.length()arguments?)3 reassign skvariableName? to sk.push("apple")value or expression?4 reassign skvariableName? to sk.push("banana")value or expression?5 reassign skvariableName? to sk.push("cherry")value or expression?6 print(sk.length()arguments?)7 print(skarguments?)8 print(sk.peek()arguments?)9 print(sk.pop()arguments?)10 print(skarguments?)11 print(sk.pop().item_0arguments?)12 print(skarguments?)13 reassign skvariableName? to sk.pop().item_1value or expression?14 print(skarguments?)15 end main
+def main() -> None: 1 skname? = Stack[str]()value or expression? # variable definition2 print(sk.length()arguments?)3 skvariableName? = sk.push("apple")value or expression? # reassign variable4 skvariableName? = sk.push("banana")value or expression? # reassign variable5 skvariableName? = sk.push("cherry")value or expression? # reassign variable6 print(sk.length()arguments?)7 print(skarguments?)8 print(sk.peek()arguments?)9 print(sk.pop()arguments?)10 print(skarguments?)11 print(sk.pop().item_0arguments?)12 print(skarguments?)13 skvariableName? = sk.pop().item_1value or expression? # reassign variable14 print(skarguments?)15 main()
+static void main() { 1 var skname? = new Stack<string>()value or expression?;2 Console.WriteLine(sk.length()arguments?); // print3 skvariableName? = sk.push("apple")value or expression?; // reassign variable4 skvariableName? = sk.push("banana")value or expression?; // reassign variable5 skvariableName? = sk.push("cherry")value or expression?; // reassign variable6 Console.WriteLine(sk.length()arguments?); // print7 Console.WriteLine(skarguments?); // print8 Console.WriteLine(sk.peek()arguments?); // print9 Console.WriteLine(sk.pop()arguments?); // print10 Console.WriteLine(skarguments?); // print11 Console.WriteLine(sk.pop().item_0arguments?); // print12 Console.WriteLine(skarguments?); // print13 skvariableName? = sk.pop().item_1value or expression?; // reassign variable14 Console.WriteLine(skarguments?); // print15 } // main
+Sub main() 1 Dim skname? = New Stack(Of String)()value or expression? ' variable definition2 Console.WriteLine(sk.length()arguments?) ' print3 skvariableName? = sk.push("apple")value or expression? ' reassign variable4 skvariableName? = sk.push("banana")value or expression? ' reassign variable5 skvariableName? = sk.push("cherry")value or expression? ' reassign variable6 Console.WriteLine(sk.length()arguments?) ' print7 Console.WriteLine(skarguments?) ' print8 Console.WriteLine(sk.peek()arguments?) ' print9 Console.WriteLine(sk.pop()arguments?) ' print10 Console.WriteLine(skarguments?) ' print11 Console.WriteLine(sk.pop().item_0arguments?) ' print12 Console.WriteLine(skarguments?) ' print13 skvariableName? = sk.pop().item_1value or expression? ' reassign variable14 Console.WriteLine(skarguments?) ' print15 End Sub
public class Global {

+static void main() { 1 var skname? = new Stack<String>()value or expression?;2 System.out.println(sk.length()arguments?); // print3 skvariableName? = sk.push("apple")value or expression?; // reassign variable4 skvariableName? = sk.push("banana")value or expression?; // reassign variable5 skvariableName? = sk.push("cherry")value or expression?; // reassign variable6 System.out.println(sk.length()arguments?); // print7 System.out.println(skarguments?); // print8 System.out.println(sk.peek()arguments?); // print9 System.out.println(sk.pop()arguments?); // print10 System.out.println(skarguments?); // print11 System.out.println(sk.pop().item_0arguments?); // print12 System.out.println(skarguments?); // print13 skvariableName? = sk.pop().item_1value or expression?; // reassign variable14 System.out.println(skarguments?); // print15 } // main
}
















0



3
[cherry, banana, apple]
cherry
(cherry, [banana, apple])
[cherry, banana, apple]
cherry
[cherry, banana, apple]

[banana, apple]

   ● Results of enqueue and dequeue on strings in a QueueQueueQueueQueueQueue:

+main 1 variable quname? set to new Queue<of String>()value or expression?2 print(qu.length()arguments?)3 reassign quvariableName? to qu.enqueue("apple")value or expression?4 reassign quvariableName? to qu.enqueue("banana")value or expression?5 reassign quvariableName? to qu.enqueue("cherry")value or expression?6 print(qu.length()arguments?)7 print(quarguments?)8 print(qu.peek()arguments?)9 print(qu.dequeue()arguments?)10 print(quarguments?)11 print(qu.dequeue().item_0arguments?)12 print(quarguments?)13 reassign quvariableName? to qu.dequeue().item_1value or expression?14 print(quarguments?)15 end main
+def main() -> None: 1 quname? = Queue[str]()value or expression? # variable definition2 print(qu.length()arguments?)3 quvariableName? = qu.enqueue("apple")value or expression? # reassign variable4 quvariableName? = qu.enqueue("banana")value or expression? # reassign variable5 quvariableName? = qu.enqueue("cherry")value or expression? # reassign variable6 print(qu.length()arguments?)7 print(quarguments?)8 print(qu.peek()arguments?)9 print(qu.dequeue()arguments?)10 print(quarguments?)11 print(qu.dequeue().item_0arguments?)12 print(quarguments?)13 quvariableName? = qu.dequeue().item_1value or expression? # reassign variable14 print(quarguments?)15 main()
+static void main() { 1 var quname? = new Queue<string>()value or expression?;2 Console.WriteLine(qu.length()arguments?); // print3 quvariableName? = qu.enqueue("apple")value or expression?; // reassign variable4 quvariableName? = qu.enqueue("banana")value or expression?; // reassign variable5 quvariableName? = qu.enqueue("cherry")value or expression?; // reassign variable6 Console.WriteLine(qu.length()arguments?); // print7 Console.WriteLine(quarguments?); // print8 Console.WriteLine(qu.peek()arguments?); // print9 Console.WriteLine(qu.dequeue()arguments?); // print10 Console.WriteLine(quarguments?); // print11 Console.WriteLine(qu.dequeue().item_0arguments?); // print12 Console.WriteLine(quarguments?); // print13 quvariableName? = qu.dequeue().item_1value or expression?; // reassign variable14 Console.WriteLine(quarguments?); // print15 } // main
+Sub main() 1 Dim quname? = New Queue(Of String)()value or expression? ' variable definition2 Console.WriteLine(qu.length()arguments?) ' print3 quvariableName? = qu.enqueue("apple")value or expression? ' reassign variable4 quvariableName? = qu.enqueue("banana")value or expression? ' reassign variable5 quvariableName? = qu.enqueue("cherry")value or expression? ' reassign variable6 Console.WriteLine(qu.length()arguments?) ' print7 Console.WriteLine(quarguments?) ' print8 Console.WriteLine(qu.peek()arguments?) ' print9 Console.WriteLine(qu.dequeue()arguments?) ' print10 Console.WriteLine(quarguments?) ' print11 Console.WriteLine(qu.dequeue().item_0arguments?) ' print12 Console.WriteLine(quarguments?) ' print13 quvariableName? = qu.dequeue().item_1value or expression? ' reassign variable14 Console.WriteLine(quarguments?) ' print15 End Sub
public class Global {

+static void main() { 1 var quname? = new Queue<String>()value or expression?;2 System.out.println(qu.length()arguments?); // print3 quvariableName? = qu.enqueue("apple")value or expression?; // reassign variable4 quvariableName? = qu.enqueue("banana")value or expression?; // reassign variable5 quvariableName? = qu.enqueue("cherry")value or expression?; // reassign variable6 System.out.println(qu.length()arguments?); // print7 System.out.println(quarguments?); // print8 System.out.println(qu.peek()arguments?); // print9 System.out.println(qu.dequeue()arguments?); // print10 System.out.println(quarguments?); // print11 System.out.println(qu.dequeue().item_0arguments?); // print12 System.out.println(quarguments?); // print13 quvariableName? = qu.dequeue().item_1value or expression?; // reassign variable14 System.out.println(quarguments?); // print15 } // main
}
















0



3
[apple, banana, cherry]
apple
(apple, [banana, cherry])
[apple, banana, cherry]
apple
[apple, banana, cherry]

[banana, cherry]

Tuple

A Tuple is not a value or data structure Type. Rather, it is a small collection of values of differing Types held together and referenced by a single identifier.

It may be considered a lightweight alternative to defining a Class for some specific purpose.

The items in a Tuple may be literal or named values.

Tuples are referred to as 2-Tuples, 3-Tuples, etc. according to the number of values they hold.

An item within a Tuple may be another Tuple, giving nested Tuples.

A function may return a Tuple.

A Tuple differs from a List in that:

Common uses include:

Defining a Tuple

A new Tuple is defined by a list of items separated by commas and enclosed in round brackets:

variable pointname? set to (3, 4)value or expression?0pointname? = (3, 4)value or expression? # variable definition0var pointname? = (3, 4)value or expression?;0Dim pointname? = (3, 4)value or expression? ' variable definition0var pointname? = (3, 4)value or expression?;0 variable tname? set to (3, "apple", true)value or expression?0tname? = (3, "apple", True)value or expression? # variable definition0var tname? = (3, "apple", true)value or expression?;0Dim tname? = (3, "apple", True)value or expression? ' variable definition0var tname? = (3, "apple", true)value or expression?;0

Accessing items in a Tuple

The items in a Tuple may be individually addressed by a dot reference and its special properties item_N, thus:

+main 1 variable tname? set to (3, "apple", true)value or expression?2 print(targuments?)3 print(t.item_0arguments?)4 print(t.item_1arguments?)5 print(t.item_2arguments?)6 end main
+def main() -> None: 1 tname? = (3, "apple", True)value or expression? # variable definition2 print(targuments?)3 print(t.item_0arguments?)4 print(t.item_1arguments?)5 print(t.item_2arguments?)6 main()
+static void main() { 1 var tname? = (3, "apple", true)value or expression?;2 Console.WriteLine(targuments?); // print3 Console.WriteLine(t.item_0arguments?); // print4 Console.WriteLine(t.item_1arguments?); // print5 Console.WriteLine(t.item_2arguments?); // print6 } // main
+Sub main() 1 Dim tname? = (3, "apple", True)value or expression? ' variable definition2 Console.WriteLine(targuments?) ' print3 Console.WriteLine(t.item_0arguments?) ' print4 Console.WriteLine(t.item_1arguments?) ' print5 Console.WriteLine(t.item_2arguments?) ' print6 End Sub
public class Global {

+static void main() { 1 var tname? = (3, "apple", true)value or expression?;2 System.out.println(targuments?); // print3 System.out.println(t.item_0arguments?); // print4 System.out.println(t.item_1arguments?); // print5 System.out.println(t.item_2arguments?); // print6 } // main
}





(3, apple, true)
3
apple
true

And where p1 and p2 represent points each with 2-Tuples containing two FloatfloatdoubleDoubledouble values, this function returns the distance between them:

+function distanceBetweenname?(p1 as (Float, Float), p2 as (Float, Float)parameter definitions?) returns FloatType? 1 return sqrt(pow(p2.item_0 - p1.item_0, 2) + pow(p2.item_1 - p1.item_1, 2))value or expression?2 end function
+def distanceBetweenname?(p1: tuple[float, float], p2: tuple[float, float]parameter definitions?) -> floatType?: # function1 return sqrt(pow(p2.item_0 - p1.item_0, 2) + pow(p2.item_1 - p1.item_1, 2))value or expression?2
+static doubleType? distanceBetweenname?((double, double) p1, (double, double) p2parameter definitions?) { // function1 return sqrt(pow(p2.item_0 - p1.item_0, 2) + pow(p2.item_1 - p1.item_1, 2))value or expression?;2 } // function
+Function distanceBetweenname?(p1 As (Double, Double), p2 As (Double, Double)parameter definitions?) As DoubleType? 1 Return sqrt(pow(p2.item_0 - p1.item_0, 2) + pow(p2.item_1 - p1.item_1, 2))value or expression?2 End Function
public class Global {

+static doubleType? distanceBetweenname?((double, double) p1, (double, double) p2parameter definitions?) { // function1 return sqrt(pow(p2.item_0 - p1.item_0, 2) + pow(p2.item_1 - p1.item_1, 2))value or expression?;2 } // function
}

Note that the appropriate item_Ns will be listed in the Editor's drop-down menu options for the referenced Tuple.

Function dot methods on a Tuple

function
dot methods
argument
Types
return
Type
returns
equals Tuple BooleanboolboolBooleanbool true if the Types, item values and order all equal those of the argument,
false otherwise
notEqualTo Tuple BooleanboolboolBooleanbool true if any of the Types, item values and order differ from those of the argument,
false otherwise
toString (none) StringstrstringStringString String containing Tuple's items surrounded by brackets

Graphic Types

Block graphics

Block graphics provides a simple way to create low resolution graphics, ideal for simple but engaging games for example.

The graphics are defined and displayed on a grid that is 40 blocks wide by 30 blocks high.

Each block is be rendered as a solid colour.

An example of block graphics to produce a rapidly changing pattern of coloured blocks:

+main 1 variable gridname? set to createBlockGraphics(white)value or expression?2 +while truecondition? 3 variable xname? set to randint(0, 39)value or expression?4 variable yname? set to randint(0, 29)value or expression?5 variable colourname? set to randint(0, white - 1)value or expression?6 reassign grid[x][y]variableName? to colourvalue or expression?7 call displayBlocksprocedureName?(gridarguments?)8 end while end main
+def main() -> None: 1 gridname? = createBlockGraphics(white)value or expression? # variable definition2 +while Truecondition?: 3 xname? = randint(0, 39)value or expression? # variable definition4 yname? = randint(0, 29)value or expression? # variable definition5 colourname? = randint(0, white - 1)value or expression? # variable definition6 grid[x][y]variableName? = colourvalue or expression? # reassign variable7 displayBlocksprocedureName?(gridarguments?) # call procedure8 main()
+static void main() { 1 var gridname? = createBlockGraphics(white)value or expression?;2 +while (truecondition?) { 3 var xname? = randint(0, 39)value or expression?;4 var yname? = randint(0, 29)value or expression?;5 var colourname? = randint(0, white - 1)value or expression?;6 grid[x][y]variableName? = colourvalue or expression?; // reassign variable7 displayBlocksprocedureName?(gridarguments?); // call procedure8 } // while } // main
+Sub main() 1 Dim gridname? = createBlockGraphics(white)value or expression? ' variable definition2 +While Truecondition? 3 Dim xname? = randint(0, 39)value or expression? ' variable definition4 Dim yname? = randint(0, 29)value or expression? ' variable definition5 Dim colourname? = randint(0, white - 1)value or expression? ' variable definition6 grid[x][y]variableName? = colourvalue or expression? ' reassign variable7 displayBlocksprocedureName?(gridarguments?) ' call procedure8 End While End Sub
public class Global {

+static void main() { 1 var gridname? = createBlockGraphics(white)value or expression?;2 +while (truecondition?) { 3 var xname? = randint(0, 39)value or expression?;4 var yname? = randint(0, 29)value or expression?;5 var colourname? = randint(0, white - 1)value or expression?;6 grid[x][y]variableName? = colourvalue or expression?; // reassign variable7 displayBlocksprocedureName?(gridarguments?); // call procedure8 } // while } // main
}

Notes

Turtle graphics

Turtle graphics are implemented with output to the IDE's display pane, i.e. the 'paper' on which the turtle draws.

The area is 200 turtle units wide by 150 turtle units high, and both integer and floating point values of turtle units can be used. If a turtle is placed or moved outside the 200 × 150 area boundary, it will not cause an error, but the turtle and any lines drawn outside the boundary will not be visible.

The origin for turtle units (0,0) is at the centre of the area: positive x rightwards, positive y upwards. So the top left corner of the display is at (-100,75).

A new turtle's default starting position is at (0,0) facing upwards (heading is 0), from where a move will be in the y direction.

You can move and turn a turtle, causing lines to be drawn, whether or not the turtle is showing.

Procedure methods on a Turtle

procedure
method
argument
Types
action
clearAndReset (none) clears the turtle display and moves the turtle to its starting position and heading
hide (none) makes the turtle invisible in the display
move IntintintIntegerint or FloatfloatdoubleDoubledouble moves the turtle the specified number of turtle units in the direction of its heading or,
if negative, in the opposite direction
moveTo IntintintIntegerint or FloatfloatdoubleDoubledouble,
IntintintIntegerint or FloatfloatdoubleDoubledouble
moves the turtle to the specified x,y position, drawing its path if its pen is down
penColour IntintintIntegerint changes the colour of its path in the display to the literal or named value specified
penDown (none) makes the turtle's subsequent moves leave a trace of its path in the display
penUp (none) makes the turtle's subsequent moves leave no trace of its path in the display
penWidth IntintintIntegerint or FloatfloatdoubleDoubledouble changes the width of the line tracing the turtle's path in the display
default (and minimum) is 1
placeAt IntintintIntegerint or FloatfloatdoubleDoubledouble,
IntintintIntegerint or FloatfloatdoubleDoubledouble
places or repositions the turtle at the x,y position specified without drawing a path
show (none) makes the turtle visible in the display as a green blob
marked with a black radius that indicates its heading
turn IntintintIntegerint or FloatfloatdoubleDoubledouble turns the turtle through the specified number of degrees clockwise or,
if negative, anticlockwise
turnToHeading IntintintIntegerint or FloatfloatdoubleDoubledouble turns the turtle to face in the direction specified in degrees
where 0 is upward and increasing values go clockwise from there

Properties of a Turtle

The current location and heading of the turtle may be read using the properties x, y, and heading.

Property
name Type description default
heading FloatfloatdoubleDoubledouble the direction in which the turtle is pointing
in degrees clockwise from North
0.0 degrees,
i.e. upward in the display
x, y FloatfloatdoubleDoubledouble, FloatfloatdoubleDoubledouble the x,y coordinates of the turtle's current position 0.0, 0.0

Examples using turtle graphics

   ● To draw a square:

+main 1 variable tname? set to new Turtle()value or expression?2 call t.placeAtprocedureName?(-75, 50arguments?)3 call t.showprocedureName?(arguments?)4 +for iitem? in range(1, 5)source? 5 call t.turnprocedureName?(90arguments?)6 call t.moveprocedureName?(80arguments?)7 call sleepprocedureName?(0.5arguments?)8 end for end main
+def main() -> None: 1 tname? = Turtle()value or expression? # variable definition2 t.placeAtprocedureName?(-75, 50arguments?) # call procedure3 t.showprocedureName?(arguments?) # call procedure4 +for iitem? in range(1, 5)source?: 5 t.turnprocedureName?(90arguments?) # call procedure6 t.moveprocedureName?(80arguments?) # call procedure7 sleepprocedureName?(0.5arguments?) # call procedure8 main()
+static void main() { 1 var tname? = new Turtle()value or expression?;2 t.placeAtprocedureName?(-75, 50arguments?); // call procedure3 t.showprocedureName?(arguments?); // call procedure4 +foreach (iitem? in range(1, 5)source?) { 5 t.turnprocedureName?(90arguments?); // call procedure6 t.moveprocedureName?(80arguments?); // call procedure7 sleepprocedureName?(0.5arguments?); // call procedure8 } // foreach } // main
+Sub main() 1 Dim tname? = New Turtle()value or expression? ' variable definition2 t.placeAtprocedureName?(-75, 50arguments?) ' call procedure3 t.showprocedureName?(arguments?) ' call procedure4 +For Each iitem? In range(1, 5)source? 5 t.turnprocedureName?(90arguments?) ' call procedure6 t.moveprocedureName?(80arguments?) ' call procedure7 sleepprocedureName?(0.5arguments?) ' call procedure8 Next i End Sub
public class Global {

+static void main() { 1 var tname? = new Turtle()value or expression?;2 t.placeAtprocedureName?(-75, 50arguments?); // call procedure3 t.showprocedureName?(arguments?); // call procedure4 +foreach (iitem? in range(1, 5)source?) { 5 t.turnprocedureName?(90arguments?); // call procedure6 t.moveprocedureName?(80arguments?); // call procedure7 sleepprocedureName?(0.5arguments?); // call procedure8 } // foreach } // main
}

Turtle square


   ● To draw a fractal snowflake, using a procedure and recursion:

+main 1 variable tname? set to new Turtle()value or expression?2 call t.placeAtprocedureName?(-50, 30arguments?)3 call t.turnprocedureName?(90arguments?)4 call t.showprocedureName?(arguments?)5 +for iitem? in range(1, 4)source? 6 call drawSideprocedureName?(side, targuments?)7 call t.turnprocedureName?(120arguments?)8 end for end main +constant sidename? set to 100literal value or data structure?9 +procedure drawSidename?(length as Float, t as Turtleparameter definitions?) 10 +if (length > 1)condition? then 11 variable thirdname? set to length/3value or expression?12 call drawSideprocedureName?(third, targuments?)13 call t.turnprocedureName?(-60arguments?)14 call drawSideprocedureName?(third, targuments?)15 call t.turnprocedureName?(120arguments?)16 call drawSideprocedureName?(third, targuments?)17 call t.turnprocedureName?(-60arguments?)18 call drawSideprocedureName?(third, targuments?)19 else20 call t.moveprocedureName?(lengtharguments?)21 end if end procedure
+def main() -> None: 1 tname? = Turtle()value or expression? # variable definition2 t.placeAtprocedureName?(-50, 30arguments?) # call procedure3 t.turnprocedureName?(90arguments?) # call procedure4 t.showprocedureName?(arguments?) # call procedure5 +for iitem? in range(1, 4)source?: 6 drawSideprocedureName?(side, targuments?) # call procedure7 t.turnprocedureName?(120arguments?) # call procedure8 +sidename? = 100literal value or data structure? # constant9 +def drawSidename?(length: float, t: Turtleparameter definitions?) -> None: # procedure10 +if (length > 1)condition?: 11 thirdname? = length/3value or expression? # variable definition12 drawSideprocedureName?(third, targuments?) # call procedure13 t.turnprocedureName?(-60arguments?) # call procedure14 drawSideprocedureName?(third, targuments?) # call procedure15 t.turnprocedureName?(120arguments?) # call procedure16 drawSideprocedureName?(third, targuments?) # call procedure17 t.turnprocedureName?(-60arguments?) # call procedure18 drawSideprocedureName?(third, targuments?) # call procedure19 else:20 t.moveprocedureName?(lengtharguments?) # call procedure21 main()
+static void main() { 1 var tname? = new Turtle()value or expression?;2 t.placeAtprocedureName?(-50, 30arguments?); // call procedure3 t.turnprocedureName?(90arguments?); // call procedure4 t.showprocedureName?(arguments?); // call procedure5 +foreach (iitem? in range(1, 4)source?) { 6 drawSideprocedureName?(side, targuments?); // call procedure7 t.turnprocedureName?(120arguments?); // call procedure8 } // foreach } // main +const Int sidename? = 100literal value or data structure?;9 +static void drawSidename?(double length, Turtle tparameter definitions?) { // procedure10 +if ((length > 1)condition?) { 11 var thirdname? = length/3value or expression?;12 drawSideprocedureName?(third, targuments?); // call procedure13 t.turnprocedureName?(-60arguments?); // call procedure14 drawSideprocedureName?(third, targuments?); // call procedure15 t.turnprocedureName?(120arguments?); // call procedure16 drawSideprocedureName?(third, targuments?); // call procedure17 t.turnprocedureName?(-60arguments?); // call procedure18 drawSideprocedureName?(third, targuments?); // call procedure19 } else {20 t.moveprocedureName?(lengtharguments?); // call procedure21 } // if } // procedure
+Sub main() 1 Dim tname? = New Turtle()value or expression? ' variable definition2 t.placeAtprocedureName?(-50, 30arguments?) ' call procedure3 t.turnprocedureName?(90arguments?) ' call procedure4 t.showprocedureName?(arguments?) ' call procedure5 +For Each iitem? In range(1, 4)source? 6 drawSideprocedureName?(side, targuments?) ' call procedure7 t.turnprocedureName?(120arguments?) ' call procedure8 Next i End Sub +Const sidename? = 100literal value or data structure?9 +Sub drawSidename?(length As Double, t As Turtleparameter definitions?) ' procedure10 +If (length > 1)condition? Then 11 Dim thirdname? = length/3value or expression? ' variable definition12 drawSideprocedureName?(third, targuments?) ' call procedure13 t.turnprocedureName?(-60arguments?) ' call procedure14 drawSideprocedureName?(third, targuments?) ' call procedure15 t.turnprocedureName?(120arguments?) ' call procedure16 drawSideprocedureName?(third, targuments?) ' call procedure17 t.turnprocedureName?(-60arguments?) ' call procedure18 drawSideprocedureName?(third, targuments?) ' call procedure19 Else20 t.moveprocedureName?(lengtharguments?) ' call procedure21 End If End Sub
public class Global {

+static void main() { 1 var tname? = new Turtle()value or expression?;2 t.placeAtprocedureName?(-50, 30arguments?); // call procedure3 t.turnprocedureName?(90arguments?); // call procedure4 t.showprocedureName?(arguments?); // call procedure5 +foreach (iitem? in range(1, 4)source?) { 6 drawSideprocedureName?(side, targuments?); // call procedure7 t.turnprocedureName?(120arguments?); // call procedure8 } // foreach } // main +final Int sidename? = 100literal value or data structure?; // constant9 +static void drawSidename?(double length, Turtle tparameter definitions?) { // procedure10 +if ((length > 1)condition?) { 11 var thirdname? = length/3value or expression?;12 drawSideprocedureName?(third, targuments?); // call procedure13 t.turnprocedureName?(-60arguments?); // call procedure14 drawSideprocedureName?(third, targuments?); // call procedure15 t.turnprocedureName?(120arguments?); // call procedure16 drawSideprocedureName?(third, targuments?); // call procedure17 t.turnprocedureName?(-60arguments?); // call procedure18 drawSideprocedureName?(third, targuments?); // call procedure19 } else {20 t.moveprocedureName?(lengtharguments?); // call procedure21 } // if } // procedure
}

Turtle snowflake


Vector graphics

Vector graphics are implemented using the SVG (Scalable Vector Graphics) Html tag <svg>, and are output to the display pane in the user interface.

The area is 100 units wide by 75 units high, and both integer and floating point values of the units can be used.

The origin of the units (0,0) is at the top left corner of the display: positive x rightwards, positive y downwards. So for example the centre of the display is at (50, 37.5).

The names of the shapes broadly correspond to the names of SVG tags:

The properties of these shapes are named to reflect the attributes used in the SVG tags but some names differ. For example, SVG's stroke - widthstroke - widthstroke - widthstroke - widthstroke - width is assigned with property strokeWidth, to make it a valid identifier . Also strokestrokestrokestrokestroke and fillfillfillfillfill are set by the properties strokeColour and fillColour.

In addition, graphics may be displayed from any valid string of SVG tags, as described in RawVGRawVGRawVGRawVGRawVG .

Defining Vector graphic shapes

A set of SVG shapes is defined in either a List<of VectorGraphic>list[VectorGraphic]List<VectorGraphic>List(Of VectorGraphic)List<VectorGraphic> or a ListlistListListList of any specific type of VectorGraphicVectorGraphicVectorGraphicVectorGraphicVectorGraphic (e.g. List<of CircleVG>list[CircleVG]List<CircleVG>List(Of CircleVG)List<CircleVG>) by using the ListlistListListList append method.

VectorGraphicVectorGraphicVectorGraphicVectorGraphicVectorGraphic is the abstract superclass of all ..VG shapes. You use it when you want to define a ListlistListListList holding different types of shape.

Adding a shape returns a new instance of the list which must be assigned to a new or existing variable.

The constructors for the VG Types require arguments defining the attributes of the relevant SVG tags, so defaults are supplied from the Class properties, as shown in the table below.

To change the value of property 'p..', call the setP.. procedure method on the vector graphic or, in a function, use the withP.. dot method on the vector graphic, in either case specifying new values in the arguments.

The fillColour and strokeColour properties may be specified as described under Colours . Only fillColour can be specified as transparent.

Note that the height and width properties of an image are also dependent on the dimensions of the original graphic file.

Displaying Vector graphic shapes

As with Block graphics, the assembled list of shapes is not displayed until call procedure displayVectorGraphics with the list as its argument, thus allowing you to make multiple changes before display.

And as with using SVG in Html, the shapes are drawn in the order in which they are added to the VectorGraphicVectorGraphicVectorGraphicVectorGraphicVectorGraphic instance. Later shapes are positioned in front of earlier ones.

Function dot methods on Vector graphic shapes

function
dot method
on
Type
argument
Types
return
Type
returns
asHtml ImageVGImageVGImageVGImageVGImageVG none StringstrstringStringString string containing the Html <img> tag filled with the image's URL and attribute values
asSVG CircleVGCircleVGCircleVGCircleVGCircleVG none StringstrstringStringString string containing the SVG <circle> tag filled with the circle's attribute values
asSVG ImageVGImageVGImageVGImageVGImageVG none StringstrstringStringString string containing the SVG <image> tag filled with the image's URL and attribute values
asSVG LineVGLineVGLineVGLineVGLineVG none StringstrstringStringString string containing the SVG <line> tag filled with the line's attribute values
asSVG RectangleVGRectangleVGRectangleVGRectangleVGRectangleVG none StringstrstringStringString string containing the SVG <rectangle> tag filled with the rectangle's attribute values

Properties of Vector graphic shapes

This table lists the properties of the Vector graphic shapes and their default values, together with the procedure and function methods provided to alter their values in a given instance.

Property Vector graphic shape Property Method
name Type CircleVG ImageVG LineVG RectangleVG description default procedure function
alt StringstrstringStringString alternate textual description (for accessibility) empty string setAlt withAlt
centreX FloatfloatdoubleDoubledouble horizontal position of circle centre 50 setCentreX withCentreX
centreY FloatfloatdoubleDoubledouble vertical position of circle centre 37.5 setCentreY withCentreY
fillColour IntintintIntegerint colour to fill the shape yellow setFillColour withFillColour
height FloatfloatdoubleDoubledouble height to render the shape or the image Image: 13.2
Rectangle: 20
setHeight withHeight
radius FloatfloatdoubleDoubledouble radius of circle 10 setRadius withRadius
strokeColour IntintintIntegerint colour of the strokes in the shape black setStrokeColour withStrokeColour
strokeWidth IntintintIntegerint width of the strokes in the shape 1 setStrokeWidth withStrokeWidth
title FloatfloatdoubleDoubledouble title text empty string setTitle withTitle
width FloatfloatdoubleDoubledouble width to render the shape or the image Image: 13.2
Rectangle: 40
setWidth withWidth
x, y FloatfloatdoubleDoubledouble, FloatfloatdoubleDoubledouble ✔ ✔ ✔ ✔ image's x,y position from top left Image: 0, 0
Rectangle: 10, 10
setX, setY withX, withY
x1, y1 FloatfloatdoubleDoubledouble, FloatfloatdoubleDoubledouble ✔ ✔ line's starting x,y position from top left 10, 10 setX1, setY1 withX1, withY1
x2, y2 FloatfloatdoubleDoubledouble, FloatfloatdoubleDoubledouble ✔ ✔ line's ending x,y position from top left 70, 40 setX2, setY2 withX2, withY2

Examples using simple SVG graphics

   ● To draw a circle with a coloured circumference:

+main 1 variable vgname? set to new List<of VectorGraphic>()value or expression?2 variable circname? set to new CircleVG()value or expression?3 call circ.setCentreXprocedureName?(20arguments?)4 call circ.setCentreYprocedureName?(20arguments?)5 call circ.setRadiusprocedureName?(5arguments?)6 call circ.setFillColourprocedureName?(greenarguments?)7 call circ.setStrokeColourprocedureName?(redarguments?)8 call circ.setStrokeWidthprocedureName?(2arguments?)9 call vg.appendprocedureName?(circarguments?)10 call displayVectorGraphicsprocedureName?(vgarguments?)11 end main
+def main() -> None: 1 vgname? = list[VectorGraphic]()value or expression? # variable definition2 circname? = CircleVG()value or expression? # variable definition3 circ.setCentreXprocedureName?(20arguments?) # call procedure4 circ.setCentreYprocedureName?(20arguments?) # call procedure5 circ.setRadiusprocedureName?(5arguments?) # call procedure6 circ.setFillColourprocedureName?(greenarguments?) # call procedure7 circ.setStrokeColourprocedureName?(redarguments?) # call procedure8 circ.setStrokeWidthprocedureName?(2arguments?) # call procedure9 vg.appendprocedureName?(circarguments?) # call procedure10 displayVectorGraphicsprocedureName?(vgarguments?) # call procedure11 main()
+static void main() { 1 var vgname? = new List<VectorGraphic>()value or expression?;2 var circname? = new CircleVG()value or expression?;3 circ.setCentreXprocedureName?(20arguments?); // call procedure4 circ.setCentreYprocedureName?(20arguments?); // call procedure5 circ.setRadiusprocedureName?(5arguments?); // call procedure6 circ.setFillColourprocedureName?(greenarguments?); // call procedure7 circ.setStrokeColourprocedureName?(redarguments?); // call procedure8 circ.setStrokeWidthprocedureName?(2arguments?); // call procedure9 vg.appendprocedureName?(circarguments?); // call procedure10 displayVectorGraphicsprocedureName?(vgarguments?); // call procedure11 } // main
+Sub main() 1 Dim vgname? = New List(Of VectorGraphic)()value or expression? ' variable definition2 Dim circname? = New CircleVG()value or expression? ' variable definition3 circ.setCentreXprocedureName?(20arguments?) ' call procedure4 circ.setCentreYprocedureName?(20arguments?) ' call procedure5 circ.setRadiusprocedureName?(5arguments?) ' call procedure6 circ.setFillColourprocedureName?(greenarguments?) ' call procedure7 circ.setStrokeColourprocedureName?(redarguments?) ' call procedure8 circ.setStrokeWidthprocedureName?(2arguments?) ' call procedure9 vg.appendprocedureName?(circarguments?) ' call procedure10 displayVectorGraphicsprocedureName?(vgarguments?) ' call procedure11 End Sub
public class Global {

+static void main() { 1 var vgname? = new List<VectorGraphic>()value or expression?;2 var circname? = new CircleVG()value or expression?;3 circ.setCentreXprocedureName?(20arguments?); // call procedure4 circ.setCentreYprocedureName?(20arguments?); // call procedure5 circ.setRadiusprocedureName?(5arguments?); // call procedure6 circ.setFillColourprocedureName?(greenarguments?); // call procedure7 circ.setStrokeColourprocedureName?(redarguments?); // call procedure8 circ.setStrokeWidthprocedureName?(2arguments?); // call procedure9 vg.appendprocedureName?(circarguments?); // call procedure10 displayVectorGraphicsprocedureName?(vgarguments?); // call procedure11 } // main
}

circle


   ● To draw a circle that changes between red and green every second:

+main 1 variable vgname? set to new List<of VectorGraphic>()value or expression?2 variable circname? set to new CircleVG()value or expression?3 call circ.setCentreXprocedureName?(50arguments?)4 call circ.setCentreYprocedureName?(37.5arguments?)5 call circ.setRadiusprocedureName?(30arguments?)6 call circ.setFillColourprocedureName?(greenarguments?)7 call vg.appendprocedureName?(circarguments?)8 +while truecondition? 9 call displayVectorGraphicsprocedureName?(vgarguments?)10 call sleepprocedureName?(1arguments?)11 call circ.setFillColourprocedureName?(redarguments?)12 call displayVectorGraphicsprocedureName?(vgarguments?)13 call sleepprocedureName?(1arguments?)14 call circ.setFillColourprocedureName?(greenarguments?)15 end while call displayVectorGraphicsprocedureName?(vgarguments?)16 end main
+def main() -> None: 1 vgname? = list[VectorGraphic]()value or expression? # variable definition2 circname? = CircleVG()value or expression? # variable definition3 circ.setCentreXprocedureName?(50arguments?) # call procedure4 circ.setCentreYprocedureName?(37.5arguments?) # call procedure5 circ.setRadiusprocedureName?(30arguments?) # call procedure6 circ.setFillColourprocedureName?(greenarguments?) # call procedure7 vg.appendprocedureName?(circarguments?) # call procedure8 +while Truecondition?: 9 displayVectorGraphicsprocedureName?(vgarguments?) # call procedure10 sleepprocedureName?(1arguments?) # call procedure11 circ.setFillColourprocedureName?(redarguments?) # call procedure12 displayVectorGraphicsprocedureName?(vgarguments?) # call procedure13 sleepprocedureName?(1arguments?) # call procedure14 circ.setFillColourprocedureName?(greenarguments?) # call procedure15 displayVectorGraphicsprocedureName?(vgarguments?) # call procedure16 main()
+static void main() { 1 var vgname? = new List<VectorGraphic>()value or expression?;2 var circname? = new CircleVG()value or expression?;3 circ.setCentreXprocedureName?(50arguments?); // call procedure4 circ.setCentreYprocedureName?(37.5arguments?); // call procedure5 circ.setRadiusprocedureName?(30arguments?); // call procedure6 circ.setFillColourprocedureName?(greenarguments?); // call procedure7 vg.appendprocedureName?(circarguments?); // call procedure8 +while (truecondition?) { 9 displayVectorGraphicsprocedureName?(vgarguments?); // call procedure10 sleepprocedureName?(1arguments?); // call procedure11 circ.setFillColourprocedureName?(redarguments?); // call procedure12 displayVectorGraphicsprocedureName?(vgarguments?); // call procedure13 sleepprocedureName?(1arguments?); // call procedure14 circ.setFillColourprocedureName?(greenarguments?); // call procedure15 } // while displayVectorGraphicsprocedureName?(vgarguments?); // call procedure16 } // main
+Sub main() 1 Dim vgname? = New List(Of VectorGraphic)()value or expression? ' variable definition2 Dim circname? = New CircleVG()value or expression? ' variable definition3 circ.setCentreXprocedureName?(50arguments?) ' call procedure4 circ.setCentreYprocedureName?(37.5arguments?) ' call procedure5 circ.setRadiusprocedureName?(30arguments?) ' call procedure6 circ.setFillColourprocedureName?(greenarguments?) ' call procedure7 vg.appendprocedureName?(circarguments?) ' call procedure8 +While Truecondition? 9 displayVectorGraphicsprocedureName?(vgarguments?) ' call procedure10 sleepprocedureName?(1arguments?) ' call procedure11 circ.setFillColourprocedureName?(redarguments?) ' call procedure12 displayVectorGraphicsprocedureName?(vgarguments?) ' call procedure13 sleepprocedureName?(1arguments?) ' call procedure14 circ.setFillColourprocedureName?(greenarguments?) ' call procedure15 End While displayVectorGraphicsprocedureName?(vgarguments?) ' call procedure16 End Sub
public class Global {

+static void main() { 1 var vgname? = new List<VectorGraphic>()value or expression?;2 var circname? = new CircleVG()value or expression?;3 circ.setCentreXprocedureName?(50arguments?); // call procedure4 circ.setCentreYprocedureName?(37.5arguments?); // call procedure5 circ.setRadiusprocedureName?(30arguments?); // call procedure6 circ.setFillColourprocedureName?(greenarguments?); // call procedure7 vg.appendprocedureName?(circarguments?); // call procedure8 +while (truecondition?) { 9 displayVectorGraphicsprocedureName?(vgarguments?); // call procedure10 sleepprocedureName?(1arguments?); // call procedure11 circ.setFillColourprocedureName?(redarguments?); // call procedure12 displayVectorGraphicsprocedureName?(vgarguments?); // call procedure13 sleepprocedureName?(1arguments?); // call procedure14 circ.setFillColourprocedureName?(greenarguments?); // call procedure15 } // while displayVectorGraphicsprocedureName?(vgarguments?); // call procedure16 } // main
}

RawVGRawVGRawVGRawVGRawVG

Strings containing raw SVG tags may be assembled and plotted directly using Class RawVGRawVGRawVGRawVGRawVG. By this means features such as simple SVG animation can be defined.

Example using RawVGRawVGRawVGRawVGRawVG

   ● To display a repeating movement of a circle:

+main 1 variable movingCirclename? set to "<circle cx='50' cy='50' r='50' style='fill:red;'>\n<animate attributeName='cx' begin='0s' dur='2s' from='50' to='90%' repeatCount='indefinite' /></circle>"value or expression?2 variable rawname? set to (new RawVG()).withContent(movingCircle)value or expression?3 call displayVectorGraphicsprocedureName?([raw]arguments?)4 end main
+def main() -> None: 1 movingCirclename? = "<circle cx='50' cy='50' r='50' style='fill:red;'>\n<animate attributeName='cx' begin='0s' dur='2s' from='50' to='90%' repeatCount='indefinite' /></circle>"value or expression? # variable definition2 rawname? = (RawVG()).withContent(movingCircle)value or expression? # variable definition3 displayVectorGraphicsprocedureName?([raw]arguments?) # call procedure4 main()
+static void main() { 1 var movingCirclename? = "<circle cx='50' cy='50' r='50' style='fill:red;'>\n<animate attributeName='cx' begin='0s' dur='2s' from='50' to='90%' repeatCount='indefinite' /></circle>"value or expression?;2 var rawname? = (new RawVG()).withContent(movingCircle)value or expression?;3 displayVectorGraphicsprocedureName?([raw]arguments?); // call procedure4 } // main
+Sub main() 1 Dim movingCirclename? = "<circle cx='50' cy='50' r='50' style='fill:red;'>\n<animate attributeName='cx' begin='0s' dur='2s' from='50' to='90%' repeatCount='indefinite' /></circle>"value or expression? ' variable definition2 Dim rawname? = (New RawVG()).withContent(movingCircle)value or expression? ' variable definition3 displayVectorGraphicsprocedureName?({raw}arguments?) ' call procedure4 End Sub
public class Global {

+static void main() { 1 var movingCirclename? = "<circle cx='50' cy='50' r='50' style='fill:red;'>\n<animate attributeName='cx' begin='0s' dur='2s' from='50' to='90%' repeatCount='indefinite' /></circle>"value or expression?;2 var rawname? = (new RawVG()).withContent(movingCircle)value or expression?;3 displayVectorGraphicsprocedureName?([raw]arguments?); // call procedure4 } // main
}

Combining graphic outputs

Program outputs, whether text or graphical, can be combined in the display. In particular, Block graphics and text or Html printing can share the display along with either Vector graphics or Turtle graphics (but not both).

If you want to share the display in this way, remember that both text and Html print outputs appear sequentially down the display (which can be scrolled), whereas the graphic outputs are positioned in the display using their own absolute coordinate systems.

The order in which the outputs are displayed (and therefore overwrite) is:

  1. Block graphics
  2. Vector or Turtle graphics
  3. Printed text or Html

So some care is needed to manage the layout in the display.

Note that, while vector graphics are being drawn, printed text that exceeds the height of the display does not scroll until the graphic completes.

Other Types

Random

Generating random numbers within a function

It is not possible to use the system methods random or randint within a function because they create unseen side effects. You may use those system methods outside the function and pass the resulting random number (as an IntintintIntegerint or a FloatfloatdoubleDoubledouble) as an argument into a function.

It is, however, possible to create and use random numbers within a function, but it requires a different approach and is a little more complex. You use the special type RandomRandomRandomRandomRandom. (Note the upper case RRRRR required for a type name).

You start by getting a seed random number in your main or in a procedure using method initialiseFromClock:

variable rndname? set to new Random()value or expression?0rndname? = Random()value or expression? # variable definition0var rndname? = new Random()value or expression?;0Dim rndname? = New Random()value or expression? ' variable definition0var rndname? = new Random()value or expression?;0
call rnd.initialiseFromClockprocedureName?(arguments?)0rnd.initialiseFromClockprocedureName?(arguments?) # call procedure0rnd.initialiseFromClockprocedureName?(arguments?); // call procedure0rnd.initialiseFromClockprocedureName?(arguments?) ' call procedure0rnd.initialiseFromClockprocedureName?(arguments?); // call procedure0

Then, in a function, apply dot method asFloat or asInt as appropriate to the RandomRandomRandomRandomRandom passed in, and dot method nextGen to obtain a new instance of RandomRandomRandomRandomRandom for generating the next random number.

Avoid applying nextGen more than once on the same RandomRandomRandomRandomRandom instance, because it will return the same values.

If the initialiseFromClock call is absent, the program will still generate a sequence of random values, but the sequence will be exactly the same each time you run the program. Initialising from the clock ensures that you get a different sequence each run. Using RandomRandomRandomRandomRandom without so initialising, however, can be extremely useful for testing purposes since the results are repeatable.

Function method for random seed

procedure
method
argument
Type
action
initialiseFromClock (none) uses the system clock to provide a seed
from which to generate fresh random values

Function dot methods on a RandomRandomRandomRandomRandom

function
dot method
argument
Types
return
Type
returns
asFloat (none) FloatfloatdoubleDoubledouble random FloatfloatdoubleDoubledouble value in the range (0.0, 1.0)
asInt IntintintIntegerint, IntintintIntegerint IntintintIntegerint random IntintintIntegerint value in the range of the arguments
nextGen (none) new codenew codenew codenew code
public class Global {

new code
}
RandomRandomRandomRandomRandom a new instance of RandomRandomRandomRandomRandom for subsequent use

Example using RandomRandomRandomRandomRandom

   ● To roll a dice 20 times in a function that returns a 2-tuple of random value and a new instance of RandomRandomRandomRandomRandom:

+main 1 variable rndname? set to new Random()value or expression?2 call rnd.initialiseFromClockprocedureName?(arguments?)3 +for iitem? in range(1, 20)source? 4 print(randomThrow(rnd).item_0arguments?)5 reassign rndvariableName? to randomThrow(rnd).item_1value or expression?6 end for end main +function randomThrowname?(rnd as Randomparameter definitions?) returns (Int, Random)Type? 7 return (rnd.asInt(1, 6), rnd.nextGen())value or expression?8 end function
+def main() -> None: 1 rndname? = Random()value or expression? # variable definition2 rnd.initialiseFromClockprocedureName?(arguments?) # call procedure3 +for iitem? in range(1, 20)source?: 4 print(randomThrow(rnd).item_0arguments?)5 rndvariableName? = randomThrow(rnd).item_1value or expression? # reassign variable6 +def randomThrowname?(rnd: Randomparameter definitions?) -> tuple[int, Random]Type?: # function7 return (rnd.asInt(1, 6), rnd.nextGen())value or expression?8 main()
+static void main() { 1 var rndname? = new Random()value or expression?;2 rnd.initialiseFromClockprocedureName?(arguments?); // call procedure3 +foreach (iitem? in range(1, 20)source?) { 4 Console.WriteLine(randomThrow(rnd).item_0arguments?); // print5 rndvariableName? = randomThrow(rnd).item_1value or expression?; // reassign variable6 } // foreach } // main +static (int, Random)Type? randomThrowname?(Random rndparameter definitions?) { // function7 return (rnd.asInt(1, 6), rnd.nextGen())value or expression?;8 } // function
+Sub main() 1 Dim rndname? = New Random()value or expression? ' variable definition2 rnd.initialiseFromClockprocedureName?(arguments?) ' call procedure3 +For Each iitem? In range(1, 20)source? 4 Console.WriteLine(randomThrow(rnd).item_0arguments?) ' print5 rndvariableName? = randomThrow(rnd).item_1value or expression? ' reassign variable6 Next i End Sub +Function randomThrowname?(rnd As Randomparameter definitions?) As (Integer, Random)Type? 7 Return (rnd.asInt(1, 6), rnd.nextGen())value or expression?8 End Function
public class Global {

+static void main() { 1 var rndname? = new Random()value or expression?;2 rnd.initialiseFromClockprocedureName?(arguments?); // call procedure3 +foreach (iitem? in range(1, 20)source?) { 4 System.out.println(randomThrow(rnd).item_0arguments?); // print5 rndvariableName? = randomThrow(rnd).item_1value or expression?; // reassign variable6 } // foreach } // main +static (int, Random)Type? randomThrowname?(Random rndparameter definitions?) { // function7 return (rnd.asInt(1, 6), rnd.nextGen())value or expression?;8 } // function
}

Input/output

This section covers a variety of input and output facilities:

Keyboard input

soliciting and retrieving keyboard input requires using these system methods:

system
method
argument
Types
return
Types
action
getKey (none) StringstrstringStringString returns the last character last pressed on the keyboard during program execution
getKeyWithModifier (none) 2-Tuple:
(StringstrstringStringString, StringstrstringStringString)
returns the last key combination pressed on the keyboard:
the key pressed and the modifier key's name (if also pressed)
getNumericKey (none) StringstrstringStringString returns either the numeric key last pressed or, if the last pressed key was not numeric, then "-1""-1""-1""-1""-1"
input StringstrstringStringString StringstrstringStringString prints the string as a prompt, and returns the typed input when Enter is pressed, similar to the input instruction.
inputStringWithLimits StringstrstringStringString, IntintintIntegerint, IntintintIntegerint StringstrstringStringString prints the string as a prompt and returns the typed input when Enter is pressed
provided the length of the response is within the minimum and maximum limits specified.
If it is not, the prompt is repeated with the relevant limit displayed
inputStringFromOptions StringstrstringStringString, ListlistListListList<of StringstrstringStringString> StringstrstringStringString prints the string as a prompt and returns the typed input when Enter is pressed
provided it is one of the options in the list.
If it is not, the prompt is repeated with the options displayed
inputInt StringstrstringStringString IntintintIntegerint prints the string as a prompt and returns the value of the typed input when Enter is pressed
provided that it is an integer.
If it is not, the prompt is repeated with an error message
inputIntBetween StringstrstringStringString, IntintintIntegerint, IntintintIntegerint IntintintIntegerint prints the string as a prompt and returns the value of the typed input when Enter is pressed
provided that it is an integer with a value in the (inclusive) range.
The first range value must be less than or equal to the second
inputFloat StringstrstringStringString FloatfloatdoubleDoubledouble prints the string as a prompt and returns the value of the typed input when Enter is pressed
provided that it is a number.
If it is not, the prompt is repeated with an error message
inputFloatBetween StringstrstringStringString, IntintintIntegerint, IntintintIntegerint FloatfloatdoubleDoubledouble prints the string as a prompt and returns the value of the typed input when Enter is pressed
provided that it is a number with a value in the (inclusive) range.
The first range value must be less than or equal to the second
waitForKey (none) StringstrstringStringString pauses execution of the program until a key is pressed on the keyboard,
and returns either a character or the name of a non-character key

Reading keys 'on the fly'

In some applications – especially in games, for example – you want the program to react to a key pressed by the user, but without holding up the program to wait for value to be input.

Whether your application makes use of graphics, or uses the display just for text, reading keystrokes 'on the fly' is done via one of the three methods shown here:

+main 1 variable key1name? set to getKey()value or expression?2 variable key2name? set to getNumericKey()value or expression?3 variable kmname? set to getKeyWithModifier()value or expression?4 variable keyCapname? set to km.item_0value or expression?5 variable keyModname? set to km.item_1value or expression?6 end main
+def main() -> None: 1 key1name? = getKey()value or expression? # variable definition2 key2name? = getNumericKey()value or expression? # variable definition3 kmname? = getKeyWithModifier()value or expression? # variable definition4 keyCapname? = km.item_0value or expression? # variable definition5 keyModname? = km.item_1value or expression? # variable definition6 main()
+static void main() { 1 var key1name? = getKey()value or expression?;2 var key2name? = getNumericKey()value or expression?;3 var kmname? = getKeyWithModifier()value or expression?;4 var keyCapname? = km.item_0value or expression?;5 var keyModname? = km.item_1value or expression?;6 } // main
+Sub main() 1 Dim key1name? = getKey()value or expression? ' variable definition2 Dim key2name? = getNumericKey()value or expression? ' variable definition3 Dim kmname? = getKeyWithModifier()value or expression? ' variable definition4 Dim keyCapname? = km.item_0value or expression? ' variable definition5 Dim keyModname? = km.item_1value or expression? ' variable definition6 End Sub
public class Global {

+static void main() { 1 var key1name? = getKey()value or expression?;2 var key2name? = getNumericKey()value or expression?;3 var kmname? = getKeyWithModifier()value or expression?;4 var keyCapname? = km.item_0value or expression?;5 var keyModname? = km.item_1value or expression?;6 } // main
}
+main 1 call pressAnyKeyToContinueprocedureName?(?)2 print("OK, press A or B"arguments?)3 variable keyname? set to waitForKey()value or expression?4 print($"That was {key}"arguments?)5 end main
+def main() -> None: 1 pressAnyKeyToContinueprocedureName?(?) # call procedure2 print("OK, press A or B"arguments?)3 keyname? = waitForKey()value or expression? # variable definition4 print(f"That was {key}"arguments?)5 main()
+static void main() { 1 pressAnyKeyToContinueprocedureName?(?); // call procedure2 Console.WriteLine("OK, press A or B"arguments?); // print3 var keyname? = waitForKey()value or expression?;4 Console.WriteLine($"That was {key}"arguments?); // print5 } // main
+Sub main() 1 pressAnyKeyToContinueprocedureName?(?) ' call procedure2 Console.WriteLine("OK, press A or B"arguments?) ' print3 Dim keyname? = waitForKey()value or expression? ' variable definition4 Console.WriteLine($"That was {key}"arguments?) ' print5 End Sub
public class Global {

+static void main() { 1 pressAnyKeyToContinueprocedureName?(?); // call procedure2 System.out.println("OK, press A or B"arguments?); // print3 var keyname? = waitForKey()value or expression?;4 System.out.println(String.format("That was %", key)arguments?); // print5 } // main
}

Text file input/output

Reading or writing a text file requires that you open (for reading) or create (for writing) a file using these system methods:

system
method
argument
Types
return
Class
action
createFileForWriting StringstrstringStringString TextFileWriterTextFileWriterTextFileWriterTextFileWriterTextFileWriter sets up a buffer for the data to be output, and specifies a filename (or the empty string) with or without the default filetype of .txt, and returns a file handle
see Writing text files
openFileForReading (none) TextFileReaderTextFileReaderTextFileReaderTextFileReaderTextFileReader opens a file system dialog to choose the filename of filetype .txt to be read, and returns a file handle
see Reading text files

Writing text files

The TextFileWriterTextFileWriterTextFileWriterTextFileWriterTextFileWriter Class is used to write textual data to a file.

An instance is created by the system method createFileForWriting.

The available procedure methods are:

procedure
method
argument
Type
action
writeLine StringstrstringStringString writes the string to the buffer
writeWholeFile StringstrstringStringString writes the string to the buffer and then outputs the buffer to the file system
saveAndClose none writes the buffer to the file system

These methods may be used to write a whole file in one go:

+main 1 variable filename? set to createFileForWriting("myFile.txt")value or expression?2 call file.writeWholeFileprocedureName?("Text line 1\nText line 2"arguments?)3 end main
+def main() -> None: 1 filename? = createFileForWriting("myFile.txt")value or expression? # variable definition2 file.writeWholeFileprocedureName?("Text line 1\nText line 2"arguments?) # call procedure3 main()
+static void main() { 1 var filename? = createFileForWriting("myFile.txt")value or expression?;2 file.writeWholeFileprocedureName?("Text line 1\nText line 2"arguments?); // call procedure3 } // main
+Sub main() 1 Dim filename? = createFileForWriting("myFile.txt")value or expression? ' variable definition2 file.writeWholeFileprocedureName?("Text line 1\nText line 2"arguments?) ' call procedure3 End Sub
public class Global {

+static void main() { 1 var filename? = createFileForWriting("myFile.txt")value or expression?;2 file.writeWholeFileprocedureName?("Text line 1\nText line 2"arguments?); // call procedure3 } // main
}

Notes

Reading text files

The TextFileReaderTextFileReaderTextFileReaderTextFileReaderTextFileReader Class is used to read text data from a file with type extension .txt.

An instance is created by the system method openFileForReading.

The available procedure methods are:

procedure
method
argument
Type
action
readLine (none) reads the next substring from the file that is terminated with a newline
readWholeFile (none) reads the whole file and closes the file
endOfFile (none) returns true after the last line has been read
– otherwise false
close (none) closes the file

These methods may be used to read a whole file in one go:

+main 1 variable filename? set to openFileForReading()value or expression?2 variable textname? set to file.readWholeFile()value or expression?3 print(textarguments?)4 end main
+def main() -> None: 1 filename? = openFileForReading()value or expression? # variable definition2 textname? = file.readWholeFile()value or expression? # variable definition3 print(textarguments?)4 main()
+static void main() { 1 var filename? = openFileForReading()value or expression?;2 var textname? = file.readWholeFile()value or expression?;3 Console.WriteLine(textarguments?); // print4 } // main
+Sub main() 1 Dim filename? = openFileForReading()value or expression? ' variable definition2 Dim textname? = file.readWholeFile()value or expression? ' variable definition3 Console.WriteLine(textarguments?) ' print4 End Sub
public class Global {

+static void main() { 1 var filename? = openFileForReading()value or expression?;2 var textname? = file.readWholeFile()value or expression?;3 System.out.println(textarguments?); // print4 } // main
}

Notes

Rendering Html in the display

If you embed Html code in a string and then attempt to print it, you will see the string displayed literally: the Html tags will not be recognised. This is for security reasons. However, it is possible to display formatted Html in the display. The following code:

call displayHtmlprocedureName?("<h1 style='color: blue;'>A heading</h1><p>some text</p>"arguments?)0
displayHtmlprocedureName?("<h1 style='color: blue;'>A heading</h1><p>some text</p>"arguments?) # call procedure0
displayHtmlprocedureName?("<h1 style='color: blue;'>A heading</h1><p>some text</p>"arguments?); // call procedure0
displayHtmlprocedureName?("<h1 style='color: blue;'>A heading</h1><p>some text</p>"arguments?) ' call procedure0
displayHtmlprocedureName?("<h1 style='color: blue;'>A heading</h1><p>some text</p>"arguments?); // call procedure0

will produce:

Html 1

This Html forms another 'layer' in the IDE's display pane. Any plain text that you print (using call procedure print() or any of the print procedures) will be overlaid on top of this.

You can clear just the Html layer in the display using the procedure clearHtml .

For specifying style or other attributes within Html tags, the attribute values should be enclosed in single quotation marks ' as shown above. Html will recognise single or double quotation marks, but entering double quotation marks would terminate the Elan string. Alternatively, you could use the constant quotes within curly braces as an interpolated field .

Using an embedded CSS stylesheet

You can also specify a <style> tag at the start of your Html string, to apply to the whole Html being displayed. In this case you would put the style definition into a named value as a literal but enclosed in single quotes, for example:

+main 1 variable stylename? set to "<style> h1 { color: Red; font-size: 24pt; } p { font-family: Serif; } </style>"value or expression?2 call displayHtmlprocedureName?($"{style}<h1>New heading</h1><p>some new text</p>"arguments?)3 end main
+def main() -> None: 1 stylename? = "<style> h1 { color: Red; font-size: 24pt; } p { font-family: Serif; } </style>"value or expression? # variable definition2 displayHtmlprocedureName?(f"{style}<h1>New heading</h1><p>some new text</p>"arguments?) # call procedure3 main()
+static void main() { 1 var stylename? = "<style> h1 { color: Red; font-size: 24pt; } p { font-family: Serif; } </style>"value or expression?;2 displayHtmlprocedureName?($"{style}<h1>New heading</h1><p>some new text</p>"arguments?); // call procedure3 } // main
+Sub main() 1 Dim stylename? = "<style> h1 { color: Red; font-size: 24pt; } p { font-family: Serif; } </style>"value or expression? ' variable definition2 displayHtmlprocedureName?($"{style}<h1>New heading</h1><p>some new text</p>"arguments?) ' call procedure3 End Sub
public class Global {

+static void main() { 1 var stylename? = "<style> h1 { color: Red; font-size: 24pt; } p { font-family: Serif; } </style>"value or expression?;2 displayHtmlprocedureName?(String.format("%<h1>New heading</h1><p>some new text</p>", style)arguments?); // call procedure3 } // main
}

will produce:

Html 2

Displaying images from URLs

An image that can be retrieved with an http or https URL may be sent to the display, though note that other URI schemes, such as in file://host/path to access an image from your local file system, are not supported. Here are two techniques:

Sound

The tone procedure allows the generation of a simple tone. It requires three arguments to be provided:

Note that the volume parameter is only relative in that the actual volume will be modified by the various sound settings on the output device, and may even be muted.

Example using tone

   ● An example that plays a C major scale first ascending then descending:

+main 1 variable scalename? set to [262, 294, 330, 349, 392, 440, 494, 523]value or expression?2 variable scaleLname? set to scale.length()value or expression?3 variable quavername? set to 250value or expression?4 variable volumename? set to 1.5value or expression?5 +for iitem? in range(0, scaleL)source? 6 call toneprocedureName?(quaver, scale[i], volumearguments?)7 end for call sleepprocedureName?(1arguments?)8 +for iitem? in range(0, scaleL)source? 9 call toneprocedureName?(quaver, scale[scaleL - 1 - i], volumearguments?)10 end for end main
+def main() -> None: 1 scalename? = [262, 294, 330, 349, 392, 440, 494, 523]value or expression? # variable definition2 scaleLname? = scale.length()value or expression? # variable definition3 quavername? = 250value or expression? # variable definition4 volumename? = 1.5value or expression? # variable definition5 +for iitem? in range(0, scaleL)source?: 6 toneprocedureName?(quaver, scale[i], volumearguments?) # call procedure7 sleepprocedureName?(1arguments?) # call procedure8 +for iitem? in range(0, scaleL)source?: 9 toneprocedureName?(quaver, scale[scaleL - 1 - i], volumearguments?) # call procedure10 main()
+static void main() { 1 var scalename? = [262, 294, 330, 349, 392, 440, 494, 523]value or expression?;2 var scaleLname? = scale.length()value or expression?;3 var quavername? = 250value or expression?;4 var volumename? = 1.5value or expression?;5 +foreach (iitem? in range(0, scaleL)source?) { 6 toneprocedureName?(quaver, scale[i], volumearguments?); // call procedure7 } // foreach sleepprocedureName?(1arguments?); // call procedure8 +foreach (iitem? in range(0, scaleL)source?) { 9 toneprocedureName?(quaver, scale[scaleL - 1 - i], volumearguments?); // call procedure10 } // foreach } // main
+Sub main() 1 Dim scalename? = {262, 294, 330, 349, 392, 440, 494, 523}value or expression? ' variable definition2 Dim scaleLname? = scale.length()value or expression? ' variable definition3 Dim quavername? = 250value or expression? ' variable definition4 Dim volumename? = 1.5value or expression? ' variable definition5 +For Each iitem? In range(0, scaleL)source? 6 toneprocedureName?(quaver, scale[i], volumearguments?) ' call procedure7 Next i sleepprocedureName?(1arguments?) ' call procedure8 +For Each iitem? In range(0, scaleL)source? 9 toneprocedureName?(quaver, scale[scaleL - 1 - i], volumearguments?) ' call procedure10 Next i End Sub
public class Global {

+static void main() { 1 var scalename? = [262, 294, 330, 349, 392, 440, 494, 523]value or expression?;2 var scaleLname? = scale.length()value or expression?;3 var quavername? = 250value or expression?;4 var volumename? = 1.5value or expression?;5 +foreach (iitem? in range(0, scaleL)source?) { 6 toneprocedureName?(quaver, scale[i], volumearguments?); // call procedure7 } // foreach sleepprocedureName?(1arguments?); // call procedure8 +foreach (iitem? in range(0, scaleL)source?) { 9 toneprocedureName?(quaver, scale[scaleL - 1 - i], volumearguments?); // call procedure10 } // foreach } // main
}

Common methods

Common dot methods

Click on a type to go to the Type's function dot methods, or on  to go to the specific method on that Type.

Dot method Value Type Reference Type Tuple
IntintintIntegerint FloatfloatdoubleDoubledouble BooleanboolboolBooleanbool StringstrstringStringString ListlistListListList DictionaryDictionaryDictionaryDictionaryDictionary HashSetHashSetHashSetHashSetHashSet StackStackStackStackStack QueueQueueQueueQueueQueue
ceiling note 2.
contains note 4.
equals
floor note 2.
indexOf
isInfinite note 2.
isNan note 2.
length note 3.
notEqualTo
peek
round note 2.
toString note 1.
withSet
withRemoveAt

Notes

  1. The method toString is so widely applicable because it enables you to print all variables and data structures to the IDE's display pane for debugging purposes.
  2. methods ceiling, floor, isInfinite, isNaN and round are designed for use on FloatfloatdoubleDoubledouble values, but they can accept IntintintIntegerint values without raising an error.
  3. The length of a DictionaryDictionaryDictionaryDictionaryDictionary can be found by applying method length to the list returned by method keys on the dictionary:
    print(di.keys().length()arguments?)0print(di.keys().length()arguments?)0Console.WriteLine(di.keys().length()arguments?); // print0Console.WriteLine(di.keys().length()arguments?) ' print0System.out.println(di.keys().length()arguments?); // print015
  4. Checking whether an item is contained in a DictionaryDictionaryDictionaryDictionaryDictionary can be done by applying method contains to the list returned by methods keys and values on the dictionary:
    call printprocedureName?(di.keys().contains("widget")arguments?)0printprocedureName?(di.keys().contains("widget")arguments?)0printprocedureName?(di.keys().contains("widget")arguments?);0printprocedureName?(di.keys().contains("widget")arguments?)0printprocedureName?(di.keys().contains("widget")arguments?);0true or false
    call printprocedureName?(di.values().contains(42)arguments?)0printprocedureName?(di.values().contains(42)arguments?)0printprocedureName?(di.values().contains(42)arguments?);0printprocedureName?(di.values().contains(42)arguments?)0printprocedureName?(di.values().contains(42)arguments?);0true or false

Library procedures

All procedures are accessed via a callcallcallcallcall statement.

Standalone procedures

procedureinput
argument
Types
output
argument
Types
action
clearPrintedText (none) (none) clears the IDE's display pane
clearBlocks (none) (none) clears the block graphics layer of the IDE's display pane
clearVectorGraphics (none) (none) clears the vector graphics layer of the IDE's display pane
clearHtml (none) (none) clears the Html layer of the IDE's display pane
clearAllDisplays (none) (none) clears display pane as well as the blocks, vector graphics and Html layers
clearKeyBuffer (none) (none) clears the IDE's keyboard input
pressAnyKeyToContinue BooleanboolboolBooleanbool (none) pauses execution of the program until a keyboard key is pressed
if the argument is true 'Press any key to continue' is first displayed,
if false nothing is displayed
printNoLine StringstrstringStringString (none) prints the string to the display without appending a newline so
a following call will output on the same line.
You can put your own \n newlines in the argument string
printTab IntintintIntegerint, StringstrstringStringString (none) prints the string to the display starting at the tab position given (from 0)
without appending a newline
sleep IntintintIntegerint (none) pauses the execution of the program for the specified number of seconds,
e.g. for a game sleep(1.5)sleep(1.5)sleep(1.5)sleep(1.5)sleep(1.5) delays execution for 1.5 seconds
sleep_ms IntintintIntegerint (none) pauses the execution of the program for the specified number of milliseconds,
e.g. sleep(100)sleep(100)sleep(100)sleep(100)sleep(100) delays execution for one tenth of a second

Examples using print and printTab

   ● Procedure print sends text strings to the display pane:

+main 1 print("Hello"arguments?)2 variable aname? set to 3value or expression?3 variable bname? set to 4value or expression?4 print(a*barguments?)5 print($"{a} times {b}) equals {a*b}"arguments?)6 variable tname? set to (true, 42)value or expression?7 print(t.item_0arguments?)8 print(t.item_1arguments?)9 end main
+def main() -> None: 1 print("Hello"arguments?)2 aname? = 3value or expression? # variable definition3 bname? = 4value or expression? # variable definition4 print(a*barguments?)5 print(f"{a} times {b}) equals {a*b}"arguments?)6 tname? = (True, 42)value or expression? # variable definition7 print(t.item_0arguments?)8 print(t.item_1arguments?)9 main()
+static void main() { 1 Console.WriteLine("Hello"arguments?); // print2 var aname? = 3value or expression?;3 var bname? = 4value or expression?;4 Console.WriteLine(a*barguments?); // print5 Console.WriteLine($"{a} times {b}) equals {a*b}"arguments?); // print6 var tname? = (true, 42)value or expression?;7 Console.WriteLine(t.item_0arguments?); // print8 Console.WriteLine(t.item_1arguments?); // print9 } // main
+Sub main() 1 Console.WriteLine("Hello"arguments?) ' print2 Dim aname? = 3value or expression? ' variable definition3 Dim bname? = 4value or expression? ' variable definition4 Console.WriteLine(a*barguments?) ' print5 Console.WriteLine($"{a} times {b}) equals {a*b}"arguments?) ' print6 Dim tname? = (True, 42)value or expression? ' variable definition7 Console.WriteLine(t.item_0arguments?) ' print8 Console.WriteLine(t.item_1arguments?) ' print9 End Sub
public class Global {

+static void main() { 1 System.out.println("Hello"arguments?); // print2 var aname? = 3value or expression?;3 var bname? = 4value or expression?;4 System.out.println(a*barguments?); // print5 System.out.println(String.format("% times %) equals %", a, b, a*b)arguments?); // print6 var tname? = (true, 42)value or expression?;7 System.out.println(t.item_0arguments?); // print8 System.out.println(t.item_1arguments?); // print9 } // main
}







Hello


12
3 times 4 equals 12 [using interpolated strings ]
[defining a 2-Tuple ]
true
42

   ● Procedure printTab helps in the layout of information printed to the display, e.g. when printing columns of data:

+main 1 call printTabprocedureName?(0, "Number"arguments?)2 call printTabprocedureName?(10, "Square"arguments?)3 call printTabprocedureName?(20, "Cube\n"arguments?)4 +for iitem? in range(1, 11)source? 5 call printTabprocedureName?(0, i.toString()arguments?)6 call printTabprocedureName?(10, $"{pow(i, 2)}"arguments?)7 call printTabprocedureName?(20, $"{pow(i, 3)}\n"arguments?)8 end for end main
+def main() -> None: 1 printTabprocedureName?(0, "Number"arguments?) # call procedure2 printTabprocedureName?(10, "Square"arguments?) # call procedure3 printTabprocedureName?(20, "Cube\n"arguments?) # call procedure4 +for iitem? in range(1, 11)source?: 5 printTabprocedureName?(0, i.toString()arguments?) # call procedure6 printTabprocedureName?(10, f"{pow(i, 2)}"arguments?) # call procedure7 printTabprocedureName?(20, f"{pow(i, 3)}\n"arguments?) # call procedure8 main()
+static void main() { 1 printTabprocedureName?(0, "Number"arguments?); // call procedure2 printTabprocedureName?(10, "Square"arguments?); // call procedure3 printTabprocedureName?(20, "Cube\n"arguments?); // call procedure4 +foreach (iitem? in range(1, 11)source?) { 5 printTabprocedureName?(0, i.toString()arguments?); // call procedure6 printTabprocedureName?(10, $"{pow(i, 2)}"arguments?); // call procedure7 printTabprocedureName?(20, $"{pow(i, 3)}\n"arguments?); // call procedure8 } // foreach } // main
+Sub main() 1 printTabprocedureName?(0, "Number"arguments?) ' call procedure2 printTabprocedureName?(10, "Square"arguments?) ' call procedure3 printTabprocedureName?(20, "Cube\n"arguments?) ' call procedure4 +For Each iitem? In range(1, 11)source? 5 printTabprocedureName?(0, i.toString()arguments?) ' call procedure6 printTabprocedureName?(10, $"{pow(i, 2)}"arguments?) ' call procedure7 printTabprocedureName?(20, $"{pow(i, 3)}\n"arguments?) ' call procedure8 Next i End Sub
public class Global {

+static void main() { 1 printTabprocedureName?(0, "Number"arguments?); // call procedure2 printTabprocedureName?(10, "Square"arguments?); // call procedure3 printTabprocedureName?(20, "Cube\n"arguments?); // call procedure4 +foreach (iitem? in range(1, 11)source?) { 5 printTabprocedureName?(0, i.toString()arguments?); // call procedure6 printTabprocedureName?(10, String.format("%", pow(i, 2))arguments?); // call procedure7 printTabprocedureName?(20, String.format("%\n", pow(i, 3))arguments?); // call procedure8 } // foreach } // main
}

   ● For numeric output, it is preferable to right-align the columns, e.g. when listing powers of 9:

main
main
main
main
main

Type instance procedures

Procedures applicable to standard Reference Types are linked from:

User-defined Classes may have procedures that can be applied to their Class instances.

Library methods

These methods may be referenced from within a function.

Standalone functions

Standalone library functions always return a value and are therefore used in contexts that expect a value, such as in the right-hand side of a variable definition declaration or a reassign variable, either on their own or within a more complex expression.

Standalone library functions require at least one argument to be passed (in round brackets), corresponding to the parameters defined for that function.

system
method
argument
Types
return
Types
returns
parseAsFloat StringstrstringStringString BooleanboolboolBooleanbool, FloatfloatdoubleDoubledouble a 2-Tuple in which the first item is true if the parse was successful,
false otherwise
and, if true, the second item is the FloatfloatdoubleDoubledouble value, otherwise zero
parseAsInt StringstrstringStringString BooleanboolboolBooleanbool, IntintintIntegerint a 2-Tuple in which the first item is true if the parse was successful,
false otherwise
and, if true, the second item is the IntintintIntegerint value, otherwise zero
unicode IntintintIntegerint StringstrstringStringString a string containing the one character defined at the given Unicode code point

Examples using standalone functions

   ● Deconstructing the 2-Tuple returned by parseAsInt:

variable successname? set to parseAsInt(s).item_0value or expression?0successname? = parseAsInt(s).item_0value or expression? # variable definition0var successname? = parseAsInt(s).item_0value or expression?;0Dim successname? = parseAsInt(s).item_0value or expression? ' variable definition0var successname? = parseAsInt(s).item_0value or expression?;0 variable valuename? set to parseAsInt(s).item_1value or expression?0valuename? = parseAsInt(s).item_1value or expression? # variable definition0var valuename? = parseAsInt(s).item_1value or expression?;0Dim valuename? = parseAsInt(s).item_1value or expression? ' variable definition0var valuename? = parseAsInt(s).item_1value or expression?;0

Always check the BooleanboolboolBooleanbool (success) before using the returned value (value) in case the latter is zero only because the parse was unsuccessful.


   ● Test assertions that use methods parseAsInt and parseAsFloat:

+test test_parsetest_name? 1 assert parseAsInt("31")actual (computed) value? is (true, 31)expected value? not run2 assert parseAsInt("0")actual (computed) value? is (true, 0)expected value? not run3 assert parseAsInt("thirty one")actual (computed) value? is (false, 0)expected value? not run4 assert parseAsInt("3.1")actual (computed) value? is (false, 0)expected value? not run5 assert parseAsFloat("31")actual (computed) value? is (true, 31)expected value? not run6 assert parseAsFloat("0")actual (computed) value? is (true, 0)expected value? not run7 assert parseAsFloat("3.1")actual (computed) value? is (true, 3.1)expected value? not run8 end test
+def test_parsetest_name?(self) -> None: 1 self.assertEqual(parseAsInt("31")actual (computed) value?, (True, 31)expected value?) not run2 self.assertEqual(parseAsInt("0")actual (computed) value?, (True, 0)expected value?) not run3 self.assertEqual(parseAsInt("thirty one")actual (computed) value?, (False, 0)expected value?) not run4 self.assertEqual(parseAsInt("3.1")actual (computed) value?, (False, 0)expected value?) not run5 self.assertEqual(parseAsFloat("31")actual (computed) value?, (True, 31)expected value?) not run6 self.assertEqual(parseAsFloat("0")actual (computed) value?, (True, 0)expected value?) not run7 self.assertEqual(parseAsFloat("3.1")actual (computed) value?, (True, 3.1)expected value?) not run8
+[TestMethod] static void test_parsetest_name?() { 1 Assert.AreEqual((true, 31)expected value?, parseAsInt("31")actual (computed) value?); not run2 Assert.AreEqual((true, 0)expected value?, parseAsInt("0")actual (computed) value?); not run3 Assert.AreEqual((false, 0)expected value?, parseAsInt("thirty one")actual (computed) value?); not run4 Assert.AreEqual((false, 0)expected value?, parseAsInt("3.1")actual (computed) value?); not run5 Assert.AreEqual((true, 31)expected value?, parseAsFloat("31")actual (computed) value?); not run6 Assert.AreEqual((true, 0)expected value?, parseAsFloat("0")actual (computed) value?); not run7 Assert.AreEqual((true, 3.1)expected value?, parseAsFloat("3.1")actual (computed) value?); not run8 } // test
+<TestMethod> Sub test_parsetest_name?() 1 Assert.AreEqual((True, 31)expected value?, parseAsInt("31")actual (computed) value?) not run2 Assert.AreEqual((True, 0)expected value?, parseAsInt("0")actual (computed) value?) not run3 Assert.AreEqual((False, 0)expected value?, parseAsInt("thirty one")actual (computed) value?) not run4 Assert.AreEqual((False, 0)expected value?, parseAsInt("3.1")actual (computed) value?) not run5 Assert.AreEqual((True, 31)expected value?, parseAsFloat("31")actual (computed) value?) not run6 Assert.AreEqual((True, 0)expected value?, parseAsFloat("0")actual (computed) value?) not run7 Assert.AreEqual((True, 3.1)expected value?, parseAsFloat("3.1")actual (computed) value?) not run8 End Sub
public class Global {

+@Test static void test_parsetest_name?() { 1 assertEquals((true, 31)expected value?, parseAsInt("31")actual (computed) value?); not run2 assertEquals((true, 0)expected value?, parseAsInt("0")actual (computed) value?); not run3 assertEquals((false, 0)expected value?, parseAsInt("thirty one")actual (computed) value?); not run4 assertEquals((false, 0)expected value?, parseAsInt("3.1")actual (computed) value?); not run5 assertEquals((true, 31)expected value?, parseAsFloat("31")actual (computed) value?); not run6 assertEquals((true, 0)expected value?, parseAsFloat("0")actual (computed) value?); not run7 assertEquals((true, 3.1)expected value?, parseAsFloat("3.1")actual (computed) value?); not run8 } // test
}
Notes

   ● Using method unicode:

print(unicode(0x2665)arguments?)0print(unicode(0x2665)arguments?)0Console.WriteLine(unicode(0x2665)arguments?); // print0Console.WriteLine(unicode(&H2665)arguments?) ' print0System.out.println(unicode(0x2665)arguments?); // print0

Maths functions

All the maths functions expect FloatfloatdoubleDoubledouble arguments, but IntintintIntegerint arguments are accepted. They all return a value of type FloatfloatdoubleDoubledouble, except for divAsInt which returns an IntintintIntegerint.

functionargument
Type
input
unit
returnsoutput
unit
absFloatfloatdoubleDoubledoubleabsolute value of the input
acosFloatfloatdoubleDoubledoublearccosine of the inputradians
asinFloatfloatdoubleDoubledoublearcsine of the inputradians
atanFloatfloatdoubleDoubledoublearctangent of the inputradians
cosFloatfloatdoubleDoubledoubleradianscosine of the input
divAsFloatFloatfloatdoubleDoubledouble, FloatfloatdoubleDoubledoublefirst input value divided by second input value
divAsIntFloatfloatdoubleDoubledouble, FloatfloatdoubleDoubledoublefirst input value divided by second input value
and result rounded down to integer
exp FloatfloatdoubleDoubledouble 𝑒𝑥 where 𝑥 is the argument and
𝑒 is Euler's number 2.718281828459045..
the base of natural logarithms
logEFloatfloatdoubleDoubledoublenatural logarithm of the input
log10FloatfloatdoubleDoubledoublebase-10 logarithm of the input
log2FloatfloatdoubleDoubledoublebase-2 logarithm of the input
sinFloatfloatdoubleDoubledoubleradianssine of the input
sqrtFloatfloatdoubleDoubledoublepositive square root of the input
tanFloatfloatdoubleDoubledoubleradianstangent of the input
radiansFloatfloatdoubleDoubledoubledegreesconverts input from degrees to radiansradians
degreesFloatfloatdoubleDoubledoubleradiansconverts input from radians to degreesdegrees

Examples of some maths functions and constants being tested:

+test test_mathstest_name? 1 assert piactual (computed) value? is 3.141592653589793expected value? not run2 assert abs(-3.7)actual (computed) value? is 3.7expected value? not run3 assert pow(2, 10)actual (computed) value? is 1024expected value? not run4 assert sqrt(2).round(3)actual (computed) value? is 1.414expected value? not run5 assert asin(0.5).round(3)actual (computed) value? is 0.524expected value? not run6 assert acos(0.5).round(3)actual (computed) value? is 1.047expected value? not run7 assert atan(1).round(2)actual (computed) value? is 0.79expected value? not run8 assert sin(pi/6).round(2)actual (computed) value? is 0.5expected value? not run9 assert cos(pi/4).round(3)actual (computed) value? is 0.707expected value? not run10 assert tan(pi/4).round(2)actual (computed) value? is 1expected value? not run11 assert exp(2).round(3)actual (computed) value? is 7.389expected value? not run12 assert logE(7.389).round(2)actual (computed) value? is 2expected value? not run13 assert log10(1000)actual (computed) value? is 3expected value? not run14 assert log2(65536)actual (computed) value? is 16expected value? not run15 assert log2(0x10000)actual (computed) value? is 16expected value? not run16 end test
+def test_mathstest_name?(self) -> None: 1 self.assertEqual(piactual (computed) value?, 3.141592653589793expected value?) not run2 self.assertEqual(abs(-3.7)actual (computed) value?, 3.7expected value?) not run3 self.assertEqual(pow(2, 10)actual (computed) value?, 1024expected value?) not run4 self.assertEqual(sqrt(2).round(3)actual (computed) value?, 1.414expected value?) not run5 self.assertEqual(asin(0.5).round(3)actual (computed) value?, 0.524expected value?) not run6 self.assertEqual(acos(0.5).round(3)actual (computed) value?, 1.047expected value?) not run7 self.assertEqual(atan(1).round(2)actual (computed) value?, 0.79expected value?) not run8 self.assertEqual(sin(pi/6).round(2)actual (computed) value?, 0.5expected value?) not run9 self.assertEqual(cos(pi/4).round(3)actual (computed) value?, 0.707expected value?) not run10 self.assertEqual(tan(pi/4).round(2)actual (computed) value?, 1expected value?) not run11 self.assertEqual(exp(2).round(3)actual (computed) value?, 7.389expected value?) not run12 self.assertEqual(logE(7.389).round(2)actual (computed) value?, 2expected value?) not run13 self.assertEqual(log10(1000)actual (computed) value?, 3expected value?) not run14 self.assertEqual(log2(65536)actual (computed) value?, 16expected value?) not run15 self.assertEqual(log2(0x10000)actual (computed) value?, 16expected value?) not run16
+[TestMethod] static void test_mathstest_name?() { 1 Assert.AreEqual(3.141592653589793expected value?, piactual (computed) value?); not run2 Assert.AreEqual(3.7expected value?, abs(-3.7)actual (computed) value?); not run3 Assert.AreEqual(1024expected value?, pow(2, 10)actual (computed) value?); not run4 Assert.AreEqual(1.414expected value?, sqrt(2).round(3)actual (computed) value?); not run5 Assert.AreEqual(0.524expected value?, asin(0.5).round(3)actual (computed) value?); not run6 Assert.AreEqual(1.047expected value?, acos(0.5).round(3)actual (computed) value?); not run7 Assert.AreEqual(0.79expected value?, atan(1).round(2)actual (computed) value?); not run8 Assert.AreEqual(0.5expected value?, sin(pi/6).round(2)actual (computed) value?); not run9 Assert.AreEqual(0.707expected value?, cos(pi/4).round(3)actual (computed) value?); not run10 Assert.AreEqual(1expected value?, tan(pi/4).round(2)actual (computed) value?); not run11 Assert.AreEqual(7.389expected value?, exp(2).round(3)actual (computed) value?); not run12 Assert.AreEqual(2expected value?, logE(7.389).round(2)actual (computed) value?); not run13 Assert.AreEqual(3expected value?, log10(1000)actual (computed) value?); not run14 Assert.AreEqual(16expected value?, log2(65536)actual (computed) value?); not run15 Assert.AreEqual(16expected value?, log2(0x10000)actual (computed) value?); not run16 } // test
+<TestMethod> Sub test_mathstest_name?() 1 Assert.AreEqual(3.141592653589793expected value?, piactual (computed) value?) not run2 Assert.AreEqual(3.7expected value?, abs(-3.7)actual (computed) value?) not run3 Assert.AreEqual(1024expected value?, pow(2, 10)actual (computed) value?) not run4 Assert.AreEqual(1.414expected value?, sqrt(2).round(3)actual (computed) value?) not run5 Assert.AreEqual(0.524expected value?, asin(0.5).round(3)actual (computed) value?) not run6 Assert.AreEqual(1.047expected value?, acos(0.5).round(3)actual (computed) value?) not run7 Assert.AreEqual(0.79expected value?, atan(1).round(2)actual (computed) value?) not run8 Assert.AreEqual(0.5expected value?, sin(pi/6).round(2)actual (computed) value?) not run9 Assert.AreEqual(0.707expected value?, cos(pi/4).round(3)actual (computed) value?) not run10 Assert.AreEqual(1expected value?, tan(pi/4).round(2)actual (computed) value?) not run11 Assert.AreEqual(7.389expected value?, exp(2).round(3)actual (computed) value?) not run12 Assert.AreEqual(2expected value?, logE(7.389).round(2)actual (computed) value?) not run13 Assert.AreEqual(3expected value?, log10(1000)actual (computed) value?) not run14 Assert.AreEqual(16expected value?, log2(65536)actual (computed) value?) not run15 Assert.AreEqual(16expected value?, log2(&H10000)actual (computed) value?) not run16 End Sub
public class Global {

+@Test static void test_mathstest_name?() { 1 assertEquals(3.141592653589793expected value?, piactual (computed) value?); not run2 assertEquals(3.7expected value?, abs(-3.7)actual (computed) value?); not run3 assertEquals(1024expected value?, pow(2, 10)actual (computed) value?); not run4 assertEquals(1.414expected value?, sqrt(2).round(3)actual (computed) value?); not run5 assertEquals(0.524expected value?, asin(0.5).round(3)actual (computed) value?); not run6 assertEquals(1.047expected value?, acos(0.5).round(3)actual (computed) value?); not run7 assertEquals(0.79expected value?, atan(1).round(2)actual (computed) value?); not run8 assertEquals(0.5expected value?, sin(pi/6).round(2)actual (computed) value?); not run9 assertEquals(0.707expected value?, cos(pi/4).round(3)actual (computed) value?); not run10 assertEquals(1expected value?, tan(pi/4).round(2)actual (computed) value?); not run11 assertEquals(7.389expected value?, exp(2).round(3)actual (computed) value?); not run12 assertEquals(2expected value?, logE(7.389).round(2)actual (computed) value?); not run13 assertEquals(3expected value?, log10(1000)actual (computed) value?); not run14 assertEquals(16expected value?, log2(65536)actual (computed) value?); not run15 assertEquals(16expected value?, log2(0x10000)actual (computed) value?); not run16 } // test
}

Bitwise functions

These functions take in an integer value, and manipulate the bit representation of that value.

function argument
Types
return
Type
returns
bitAnd IntintintIntegerint, IntintintIntegerint IntintintIntegerint integer whose binary representation is the bitwise AND of the inputs
bitOr IntintintIntegerint, IntintintIntegerint IntintintIntegerint integer whose binary representation is the bitwise OR of the inputs
bitNot IntintintIntegerint IntintintIntegerint integer whose binary representation is the bitwise complement of the input
bitXor IntintintIntegerint, IntintintIntegerint IntintintIntegerint integer whose binary representation is the bitwise XOR of the inputs
bitShiftL IntintintIntegerint, IntintintIntegerint IntintintIntegerint integer bit shifted to the left by the value of the second argument,
i.e. multiplied by 2 to the power of the second argument
bitShiftR IntintintIntegerint, IntintintIntegerint IntintintIntegerint integer bit shifted to the right by the value of the second argument,
i.e. divided by 2 to the power of the second argument

Examples of the bitwise functions being tested

   ● Examples of the bitwise functions being tested

+test test_bitwisetest_name? 1 variable aname? set to 13value or expression?2 assert aactual (computed) value? is 0xdexpected value? not run3 assert aactual (computed) value? is 0b1101expected value? not run4 assert a.asBinary()actual (computed) value? is "1101"expected value? not run5 variable bname? set to 30value or expression?6 assert bactual (computed) value? is 0b11110expected value? not run7 assert bitAnd(a, b)actual (computed) value? is 0b1100expected value? not run8 variable aobname? set to bitOr(a, b)value or expression?9 assert aobactual (computed) value? is 0b11111expected value? not run10 variable axbname? set to bitXor(a, b)value or expression?11 assert axbactual (computed) value? is 0b10011expected value? not run12 variable notaname? set to bitNot(a)value or expression?13 assert notaactual (computed) value? is -14expected value? not run14 variable aLname? set to bitShiftL(a, 2)value or expression?15 assert aLactual (computed) value? is 0b110100expected value? not run16 assert bitShiftR(a, 2)actual (computed) value? is 0b11expected value? not run17 end test
+def test_bitwisetest_name?(self) -> None: 1 aname? = 13value or expression? # variable definition2 self.assertEqual(aactual (computed) value?, 0xdexpected value?) not run3 self.assertEqual(aactual (computed) value?, 0b1101expected value?) not run4 self.assertEqual(a.asBinary()actual (computed) value?, "1101"expected value?) not run5 bname? = 30value or expression? # variable definition6 self.assertEqual(bactual (computed) value?, 0b11110expected value?) not run7 self.assertEqual(bitAnd(a, b)actual (computed) value?, 0b1100expected value?) not run8 aobname? = bitOr(a, b)value or expression? # variable definition9 self.assertEqual(aobactual (computed) value?, 0b11111expected value?) not run10 axbname? = bitXor(a, b)value or expression? # variable definition11 self.assertEqual(axbactual (computed) value?, 0b10011expected value?) not run12 notaname? = bitNot(a)value or expression? # variable definition13 self.assertEqual(notaactual (computed) value?, -14expected value?) not run14 aLname? = bitShiftL(a, 2)value or expression? # variable definition15 self.assertEqual(aLactual (computed) value?, 0b110100expected value?) not run16 self.assertEqual(bitShiftR(a, 2)actual (computed) value?, 0b11expected value?) not run17
+[TestMethod] static void test_bitwisetest_name?() { 1 var aname? = 13value or expression?;2 Assert.AreEqual(0xdexpected value?, aactual (computed) value?); not run3 Assert.AreEqual(0b1101expected value?, aactual (computed) value?); not run4 Assert.AreEqual("1101"expected value?, a.asBinary()actual (computed) value?); not run5 var bname? = 30value or expression?;6 Assert.AreEqual(0b11110expected value?, bactual (computed) value?); not run7 Assert.AreEqual(0b1100expected value?, bitAnd(a, b)actual (computed) value?); not run8 var aobname? = bitOr(a, b)value or expression?;9 Assert.AreEqual(0b11111expected value?, aobactual (computed) value?); not run10 var axbname? = bitXor(a, b)value or expression?;11 Assert.AreEqual(0b10011expected value?, axbactual (computed) value?); not run12 var notaname? = bitNot(a)value or expression?;13 Assert.AreEqual(-14expected value?, notaactual (computed) value?); not run14 var aLname? = bitShiftL(a, 2)value or expression?;15 Assert.AreEqual(0b110100expected value?, aLactual (computed) value?); not run16 Assert.AreEqual(0b11expected value?, bitShiftR(a, 2)actual (computed) value?); not run17 } // test
+<TestMethod> Sub test_bitwisetest_name?() 1 Dim aname? = 13value or expression? ' variable definition2 Assert.AreEqual(&Hdexpected value?, aactual (computed) value?) not run3 Assert.AreEqual(&B1101expected value?, aactual (computed) value?) not run4 Assert.AreEqual("1101"expected value?, a.asBinary()actual (computed) value?) not run5 Dim bname? = 30value or expression? ' variable definition6 Assert.AreEqual(&B11110expected value?, bactual (computed) value?) not run7 Assert.AreEqual(&B1100expected value?, bitAnd(a, b)actual (computed) value?) not run8 Dim aobname? = bitOr(a, b)value or expression? ' variable definition9 Assert.AreEqual(&B11111expected value?, aobactual (computed) value?) not run10 Dim axbname? = bitXor(a, b)value or expression? ' variable definition11 Assert.AreEqual(&B10011expected value?, axbactual (computed) value?) not run12 Dim notaname? = bitNot(a)value or expression? ' variable definition13 Assert.AreEqual(-14expected value?, notaactual (computed) value?) not run14 Dim aLname? = bitShiftL(a, 2)value or expression? ' variable definition15 Assert.AreEqual(&B110100expected value?, aLactual (computed) value?) not run16 Assert.AreEqual(&B11expected value?, bitShiftR(a, 2)actual (computed) value?) not run17 End Sub
public class Global {

+@Test static void test_bitwisetest_name?() { 1 var aname? = 13value or expression?;2 assertEquals(0xdexpected value?, aactual (computed) value?); not run3 assertEquals(0b1101expected value?, aactual (computed) value?); not run4 assertEquals("1101"expected value?, a.asBinary()actual (computed) value?); not run5 var bname? = 30value or expression?;6 assertEquals(0b11110expected value?, bactual (computed) value?); not run7 assertEquals(0b1100expected value?, bitAnd(a, b)actual (computed) value?); not run8 var aobname? = bitOr(a, b)value or expression?;9 assertEquals(0b11111expected value?, aobactual (computed) value?); not run10 var axbname? = bitXor(a, b)value or expression?;11 assertEquals(0b10011expected value?, axbactual (computed) value?); not run12 var notaname? = bitNot(a)value or expression?;13 assertEquals(-14expected value?, notaactual (computed) value?); not run14 var aLname? = bitShiftL(a, 2)value or expression?;15 assertEquals(0b110100expected value?, aLactual (computed) value?); not run16 assertEquals(0b11expected value?, bitShiftR(a, 2)actual (computed) value?); not run17 } // test
}

The result of bitNot(a) being -14-14-14-14-14 , when a is 1313131313, might be a surprise. But this is because the bitwise functions assume that the arguments are represented as 32-bit signed binary integers. So 13 is represented as
0000000000000000000000000000110100000000000000000000000000001101000000000000000000000000000011010000000000000000000000000000110100000000000000000000000000001101, and applying bitNot gives
1111111111111111111111111111001011111111111111111111111111110010111111111111111111111111111100101111111111111111111111111111001011111111111111111111111111110010which is the value -14-14-14-14-14in signed two's complement format,
the left-most bit being the sign (00000 positive, 11111 negative).


Single bit operations

   ● A reminder of single bit operations.
As noted in the example tests above, these methods act on 32-bit signed integers rather than on values of only one or a few bits, so the effect of bitNot is not just the simple bit reversal shown here:

p,q
0,00,11,01,1
bitAnd(p, q)bitAnd(p, q)bitAnd(p, q)bitAnd(p, q)bitAnd(p, q)0001
bitOr(p, q)bitOr(p, q)bitOr(p, q)bitOr(p, q)bitOr(p, q) 0111
bitNot(p)bitNot(p)bitNot(p)bitNot(p)bitNot(p) 1100
bitXor(p, q)bitXor(p, q)bitXor(p, q)bitXor(p, q)bitXor(p, q)0110

RegExp functions

Elan's regular expressions are modelled on those of JavaScript, including the syntax for literal regular expressions. See, for example this Guide to Regular Expressions .

More functions for using regular expressions will be added in a future release of Elan. For now:

The method matchesRegExp is applied to a StringstrstringStringString using dot syntax and requires a RegExpRegExpRegExpRegExpRegExp parameter specified as a literal or as variable. It returns a BooleanboolboolBooleanbool. For example:

+test test_matchesRegExptest_name? 1 variable s1name? set to "hello"value or expression?2 variable s2name? set to "World"value or expression?3 variable rname? set to /^[a-z]*$/value or expression?4 assert s1.matchesRegExp(r)actual (computed) value? is trueexpected value? not run5 assert s2.matchesRegExp(r)actual (computed) value? is falseexpected value? not run6 end test
+def test_matchesRegExptest_name?(self) -> None: 1 s1name? = "hello"value or expression? # variable definition2 s2name? = "World"value or expression? # variable definition3 rname? = /^[a-z]*$/value or expression? # variable definition4 self.assertEqual(s1.matchesRegExp(r)actual (computed) value?, Trueexpected value?) not run5 self.assertEqual(s2.matchesRegExp(r)actual (computed) value?, Falseexpected value?) not run6
+[TestMethod] static void test_matchesRegExptest_name?() { 1 var s1name? = "hello"value or expression?;2 var s2name? = "World"value or expression?;3 var rname? = /^[a-z]*$/value or expression?;4 Assert.AreEqual(trueexpected value?, s1.matchesRegExp(r)actual (computed) value?); not run5 Assert.AreEqual(falseexpected value?, s2.matchesRegExp(r)actual (computed) value?); not run6 } // test
+<TestMethod> Sub test_matchesRegExptest_name?() 1 Dim s1name? = "hello"value or expression? ' variable definition2 Dim s2name? = "World"value or expression? ' variable definition3 Dim rname? = /^[a-z]*$/value or expression? ' variable definition4 Assert.AreEqual(Trueexpected value?, s1.matchesRegExp(r)actual (computed) value?) not run5 Assert.AreEqual(Falseexpected value?, s2.matchesRegExp(r)actual (computed) value?) not run6 End Sub
public class Global {

+@Test static void test_matchesRegExptest_name?() { 1 var s1name? = "hello"value or expression?;2 var s2name? = "World"value or expression?;3 var rname? = /^[a-z]*$/value or expression?;4 assertEquals(trueexpected value?, s1.matchesRegExp(r)actual (computed) value?); not run5 assertEquals(falseexpected value?, s2.matchesRegExp(r)actual (computed) value?); not run6 } // test
}

You can convert a valid string without /..//..//..//..//../ delimiters to a RegExpRegExpRegExpRegExpRegExp using function asRegExp:

+test test_matchesRegExptest_name? 1 variable s1name? set to "hello"value or expression?2 variable s2name? set to "World"value or expression?3 variable rname? set to "^[a-z]*$".asRegExp()value or expression?4 assert s1.matchesRegExp(r)actual (computed) value? is trueexpected value? not run5 assert s2.matchesRegExp(r)actual (computed) value? is falseexpected value? not run6 end test
+def test_matchesRegExptest_name?(self) -> None: 1 s1name? = "hello"value or expression? # variable definition2 s2name? = "World"value or expression? # variable definition3 rname? = "^[a-z]*$".asRegExp()value or expression? # variable definition4 self.assertEqual(s1.matchesRegExp(r)actual (computed) value?, Trueexpected value?) not run5 self.assertEqual(s2.matchesRegExp(r)actual (computed) value?, Falseexpected value?) not run6
+[TestMethod] static void test_matchesRegExptest_name?() { 1 var s1name? = "hello"value or expression?;2 var s2name? = "World"value or expression?;3 var rname? = "^[a-z]*$".asRegExp()value or expression?;4 Assert.AreEqual(trueexpected value?, s1.matchesRegExp(r)actual (computed) value?); not run5 Assert.AreEqual(falseexpected value?, s2.matchesRegExp(r)actual (computed) value?); not run6 } // test
+<TestMethod> Sub test_matchesRegExptest_name?() 1 Dim s1name? = "hello"value or expression? ' variable definition2 Dim s2name? = "World"value or expression? ' variable definition3 Dim rname? = "^[a-z]*$".asRegExp()value or expression? ' variable definition4 Assert.AreEqual(Trueexpected value?, s1.matchesRegExp(r)actual (computed) value?) not run5 Assert.AreEqual(Falseexpected value?, s2.matchesRegExp(r)actual (computed) value?) not run6 End Sub
public class Global {

+@Test static void test_matchesRegExptest_name?() { 1 var s1name? = "hello"value or expression?;2 var s2name? = "World"value or expression?;3 var rname? = "^[a-z]*$".asRegExp()value or expression?;4 assertEquals(trueexpected value?, s1.matchesRegExp(r)actual (computed) value?); not run5 assertEquals(falseexpected value?, s2.matchesRegExp(r)actual (computed) value?); not run6 } // test
}

Although it is recommended that literal regular expressions are written with /..//..//..//..//../ delimiters, the ability to convert a stringstringstringstringstring allows you to input a regular expression into a running program.

System methods

System methods appear to work like functions, because:

They are not, however, pure functions because:

Because of these properties, system methods may be used only within the main routine or a procedure. They may not be used inside a function that you have defined, because to do so would prevent the function from being pure.

You cannot write a system method yourself.

Input/output

Clock and random numbers

Methods random and randint cannot be used in a function because of their dependence on external factors, i.e. they are subject to side effects.
To obtain random numbers within a function, use type RandomRandomRandomRandomRandom .
system
method
argument
Types
return
Types
returns
clock (none) IntintintIntegerint the current value (in milliseconds) of a system clock.
Useful for measuring elapsed time by comparing the values returned by two calls
random (none) FloatfloatdoubleDoubledouble a random number in the range [0..1]
randint IntintintIntegerint, IntintintIntegerint IntintintIntegerint a random number in the (inclusive) range between the two arguments

System functions

These methods are pure functions and so may be referenced in your functions as well as in procedures:

system
method
argument
Types
return
Types
returns
copy named value of any Type same type as argument a copy of the named value
createList IntintintIntegerint,
value of ListlistListListList item's Type
ListlistListListList<of item's Type> a List containing the specified number of items each initialised to the value in the second argument
createListOfLists IntintintIntegerint, IntintintIntegerint,
value of ListlistListListList item's Type
ListlistListListList<of ListlistListListList<of item's Type>> a List of length the first argument containing that number of Lists
each initialised to a List of length the second argument
with each item therein initialised to the value in the third argument
max ListlistListListList<of IntintintIntegerint> or
ListlistListListList<of FloatfloatdoubleDoubledouble>
IntintintIntegerint or
FloatfloatdoubleDoubledouble
the maximum value found in the List
min ListlistListListList<of IntintintIntegerint> or
ListlistListListList<of FloatfloatdoubleDoubledouble>
IntintintIntegerint or
FloatfloatdoubleDoubledouble
the minimum value found in the List
range IntintintIntegerint, IntintintIntegerint ListlistListListList a List containing the integers from the first argument to one less than the second argument.
If the second argument is not greater than the first, then the empty List is returned
rangeInSteps IntintintIntegerint, IntintintIntegerint, IntintintIntegerint ListlistListListList a List containing the integers from the first argument to one less than the second argument
in increments specified by the third argument.
If the third argument is negative, the second argument must be less than the first,
and the integers returned will run from the first to one more than the second

Examples using range or rangeInSteps

   ● Print every second item in a List:

+main 1 variable numbersname? set to ["zero", "one", "two", "three", "four", "five", "six"]value or expression?2 +for nitem? in rangeInSteps(0, numbers.length() + 1, 2)source? 3 print(numbers[n]arguments?)4 end for end main
+def main() -> None: 1 numbersname? = ["zero", "one", "two", "three", "four", "five", "six"]value or expression? # variable definition2 +for nitem? in rangeInSteps(0, numbers.length() + 1, 2)source?: 3 print(numbers[n]arguments?)4 main()
+static void main() { 1 var numbersname? = ["zero", "one", "two", "three", "four", "five", "six"]value or expression?;2 +foreach (nitem? in rangeInSteps(0, numbers.length() + 1, 2)source?) { 3 Console.WriteLine(numbers[n]arguments?); // print4 } // foreach } // main
+Sub main() 1 Dim numbersname? = {"zero", "one", "two", "three", "four", "five", "six"}value or expression? ' variable definition2 +For Each nitem? In rangeInSteps(0, numbers.length() + 1, 2)source? 3 Console.WriteLine(numbers[n]arguments?) ' print4 Next n End Sub
public class Global {

+static void main() { 1 var numbersname? = ["zero", "one", "two", "three", "four", "five", "six"]value or expression?;2 +foreach (nitem? in rangeInSteps(0, numbers.length() + 1, 2)source?) { 3 System.out.println(numbers[n]arguments?); // print4 } // foreach } // main
}

   ● Using the Higher-order Function filter to print the prime numbers less than a given limit:

+main 1 print(primesFromList(range(2, 100))arguments?)2 end main +function primesFromListname?(li as List<of Int>parameter definitions?) returns List<of Int>Type? 3 # returns primes from the list assuming it starts with a prime (e.g. 2)comment? return if(li.length() is 0, li, [li.head()].withAppendList(primesFromList(li.tail().filter(lambda n as Int => (n mod li.head()) > 0))))value or expression?4 end function
+def main() -> None: 1 print(primesFromList(range(2, 100))arguments?)2 +def primesFromListname?(li: list[int]parameter definitions?) -> list[int]Type?: # function3 # returns primes from the list assuming it starts with a prime (e.g. 2)comment? return if(li.length() == 0, li, [li.head()].withAppendList(primesFromList(li.tail().filter(lambda n: int: (n % li.head()) > 0))))value or expression?4 main()
+static void main() { 1 Console.WriteLine(primesFromList(range(2, 100))arguments?); // print2 } // main +static List<int>Type? primesFromListname?(List<int> liparameter definitions?) { // function3 // returns primes from the list assuming it starts with a prime (e.g. 2)comment? return if(li.length() == 0, li, [li.head()].withAppendList(primesFromList(li.tail().filter(int n => (n % li.head()) > 0))))value or expression?;4 } // function
+Sub main() 1 Console.WriteLine(primesFromList(range(2, 100))arguments?) ' print2 End Sub +Function primesFromListname?(li As List(Of Integer)parameter definitions?) As List(Of Integer)Type? 3 ' returns primes from the list assuming it starts with a prime (e.g. 2)comment? Return if(li.length() = 0, li, {li.head()}.withAppendList(primesFromList(li.tail().filter(Function (n As Integer) (n Mod li.head()) > 0))))value or expression?4 End Function
public class Global {

+static void main() { 1 System.out.println(primesFromList(range(2, 100))arguments?); // print2 } // main +static List<int>Type? primesFromListname?(List<int> liparameter definitions?) { // function3 // returns primes from the list assuming it starts with a prime (e.g. 2)comment? return if(li.length() == 0, li, [li.head()].withAppendList(primesFromList(li.tail().filter((int n) -> (n % li.head()) > 0))))value or expression?;4 } // function
}

Higher-order Functions (HoFs)

A higher-order Function (HoF) is one that takes in a reference to another function as a parameter. (Strictly speaking, a HoF may also be a function that returns another function, but Elan does not currently support that pattern.)

Standard HoFs

The standard library contains several HoFs that are widely recognised and used within Functional Programming, namely filter , map and reduce , and also provides maxBy , minBy and orderBy .

You cannot define your own Higher-order Functions.

Library functions that process Lists

These dot methods may be called on any ListlistListListList or StringstrstringStringString. As Higher-order Functions they take either a lambda or a function reference as one of their arguments.

These are not yet fully documented but, for readers familiar with HoFs from another programming language, some examples are shown below.

filter

You give a ListlistListListList to the Higher-order Function filter in order to return a new ListlistListListList containing a subset of items. The subset is chosen by a lambda function that tests list item values and returns a Boolean to specify filtering in or out.

Example using filter

   ● Example from demo program pathfinder.elanpathfinder.elanpathfinder.elanpathfinder.elanpathfinder.elan in which filter applies the lambdalambdalambdalambdalambda to the nodes (of Class NodeNodeNodeNodeNode) to find one that contains p (of Class PointPointPointPointPoint):

+function getNodeForname?(p as Pointparameter definitions?) returns NodeType? 1 variable matchesname? set to this.nodes.filter(lambda n as Node => n.point.equals(p))value or expression?2 return if(matches.length() is 1, matches.head(), emptyNode())value or expression?3 end function
+def getNodeForname?(p: Pointparameter definitions?) -> NodeType?: # function1 matchesname? = self.nodes.filter(lambda n: Node: n.point.equals(p))value or expression? # variable definition2 return if(matches.length() == 1, matches.head(), emptyNode())value or expression?3
+static NodeType? getNodeForname?(Point pparameter definitions?) { // function1 var matchesname? = this.nodes.filter(Node n => n.point.equals(p))value or expression?;2 return if(matches.length() == 1, matches.head(), emptyNode())value or expression?;3 } // function
+Function getNodeForname?(p As Pointparameter definitions?) As NodeType? 1 Dim matchesname? = Me.nodes.filter(Function (n As Node) n.point.equals(p))value or expression? ' variable definition2 Return if(matches.length() = 1, matches.head(), emptyNode())value or expression?3 End Function
public class Global {

+static NodeType? getNodeForname?(Point pparameter definitions?) { // function1 var matchesname? = this.nodes.filter((Node n) -> n.point.equals(p))value or expression?;2 return if(matches.length() == 1, matches.head(), emptyNode())value or expression?;3 } // function
}

map

The function map is used to apply a function to every item in a ListlistListListList, and return a new List. The function to be applied is usually specified as a lambdalambdalambdalambdalambda having a single argument of the type of the list's items, as in these examples:

Examples using map

   ● To cube each integer value in a list:

+main 1 variable liname? set to [1, 2, 3, 4, 5]value or expression?2 print(li.map(lambda n as Int => pow(n, 3))arguments?)3 end main
+def main() -> None: 1 liname? = [1, 2, 3, 4, 5]value or expression? # variable definition2 print(li.map(lambda n: int: pow(n, 3))arguments?)3 main()
+static void main() { 1 var liname? = [1, 2, 3, 4, 5]value or expression?;2 Console.WriteLine(li.map(int n => pow(n, 3))arguments?); // print3 } // main
+Sub main() 1 Dim liname? = {1, 2, 3, 4, 5}value or expression? ' variable definition2 Console.WriteLine(li.map(Function (n As Integer) pow(n, 3))arguments?) ' print3 End Sub
public class Global {

+static void main() { 1 var liname? = [1, 2, 3, 4, 5]value or expression?;2 System.out.println(li.map((int n) -> pow(n, 3))arguments?); // print3 } // main
}




[1, 8, 27, 125]

   ● To change each string in a list to upper case:

+main 1 variable namesname? set to ["Tom", "Dick", "Harriet"]value or expression?2 print(names.map(lambda s as String => s.upperCase())arguments?)3 end main
+def main() -> None: 1 namesname? = ["Tom", "Dick", "Harriet"]value or expression? # variable definition2 print(names.map(lambda s: str: s.upperCase())arguments?)3 main()
+static void main() { 1 var namesname? = ["Tom", "Dick", "Harriet"]value or expression?;2 Console.WriteLine(names.map(string s => s.upperCase())arguments?); // print3 } // main
+Sub main() 1 Dim namesname? = {"Tom", "Dick", "Harriet"}value or expression? ' variable definition2 Console.WriteLine(names.map(Function (s As String) s.upperCase())arguments?) ' print3 End Sub
public class Global {

+static void main() { 1 var namesname? = ["Tom", "Dick", "Harriet"]value or expression?;2 System.out.println(names.map((String s) -> s.upperCase())arguments?); // print3 } // main
}




[TOM, DICK, HARRIET]

   ● To reverse each string in the list of names using the function reverse (from the example of the for loop):

print(names.map(lambda s as String => reverse(s))arguments?)0print(names.map(lambda s: str: reverse(s))arguments?)0Console.WriteLine(names.map(string s => reverse(s))arguments?); // print0Console.WriteLine(names.map(Function (s As String) reverse(s))arguments?) ' print0System.out.println(names.map((String s) -> reverse(s))arguments?); // print0 [moT, kciD, teirraH]

   ● And this example from demo program maze - generator.elanmaze - generator.elanmaze - generator.elanmaze - generator.elanmaze - generator.elan:

variable nname? set to p.neighbouringPoints().map(lambda p as Point => getValue(p, g))value or expression?0nname? = p.neighbouringPoints().map(lambda p: Point: getValue(p, g))value or expression? # variable definition0var nname? = p.neighbouringPoints().map(Point p => getValue(p, g))value or expression?;0Dim nname? = p.neighbouringPoints().map(Function (p As Point) getValue(p, g))value or expression? ' variable definition0var nname? = p.neighbouringPoints().map((Point p) -> getValue(p, g))value or expression?;0

reduce

The function reduce is used to combine the items in a list in some way to produce a single result. This result may be of the same type as the items in the list, for example to:

The result may, however, be of a different type than the items in the list, and may even be a data structure, for example to:

Method reduce requires two arguments:

  1. The initial, or 'seed', value, of the type that you wish to be returned by the function specified in the second argument.. For example, if you were finding the sum of a list of type FloatfloatdoubleDoubledouble, the initial seed value would typically be 0.0. If you were creating a dictionary of words, the initial seed value would be an empty Dictionary of the correct Types.
  2. The function or lambda to be applied, which itself requires two arguments:
    1. The accumulating value, which is therefore of the same type as the initial seed value. (This will be the return value of the function or lambdalambdalambdalambdalambda).
    2. The item to which the function is applied, which is therefore of the same Type as the items in the input list.

In other words, the specified function or lambdalambdalambdalambdalambda is applied to each item of the input List in turn, in each case passing in the current value of the result. The function makes use of both to generate a new value for the result, replacing the current one for application to the next item. This is best understood by looking at the examples.

Examples using reduce

   ● To reduce the floating point values in a ListlistListListList to their sum:

+main 1 variable nname? set to [0.1, 2, 2.5, 0.3, 5.75, 0.29]value or expression?2 print(n.reduce(0.0, lambda sum as Float, m as Float => (sum + m).round(2))arguments?)3 end main
+def main() -> None: 1 nname? = [0.1, 2, 2.5, 0.3, 5.75, 0.29]value or expression? # variable definition2 print(n.reduce(0.0, lambda sum: float, m: float: (sum + m).round(2))arguments?)3 main()
+static void main() { 1 var nname? = [0.1, 2, 2.5, 0.3, 5.75, 0.29]value or expression?;2 Console.WriteLine(n.reduce(0.0, double sum, double m => (sum + m).round(2))arguments?); // print3 } // main
+Sub main() 1 Dim nname? = {0.1, 2, 2.5, 0.3, 5.75, 0.29}value or expression? ' variable definition2 Console.WriteLine(n.reduce(0.0, Function (sum As Double, m As Double) (sum + m).round(2))arguments?) ' print3 End Sub
public class Global {

+static void main() { 1 var nname? = [0.1, 2, 2.5, 0.3, 5.75, 0.29]value or expression?;2 System.out.println(n.reduce(0.0, (double sum, double m) -> (sum + m).round(2))arguments?); // print3 } // main
}




10.94
   Notes

   ● To reverse the order of items in a ListlistListListList:

+main 1 variable nname? set to [2, 3, 5, 7, 11, 13]value or expression?2 variable nRname? set to new List<of Int>()value or expression?3 variable eLname? set to new List<of Int>()value or expression?4 print(n.reduce(eL, lambda nR as List<of Int>, m as Int => nR.withPrepend(m))arguments?)5 end main
+def main() -> None: 1 nname? = [2, 3, 5, 7, 11, 13]value or expression? # variable definition2 nRname? = list[int]()value or expression? # variable definition3 eLname? = list[int]()value or expression? # variable definition4 print(n.reduce(eL, lambda nR: list[int], m: int: nR.withPrepend(m))arguments?)5 main()
+static void main() { 1 var nname? = [2, 3, 5, 7, 11, 13]value or expression?;2 var nRname? = new List<int>()value or expression?;3 var eLname? = new List<int>()value or expression?;4 Console.WriteLine(n.reduce(eL, List<int> nR, int m => nR.withPrepend(m))arguments?); // print5 } // main
+Sub main() 1 Dim nname? = {2, 3, 5, 7, 11, 13}value or expression? ' variable definition2 Dim nRname? = New List(Of Integer)()value or expression? ' variable definition3 Dim eLname? = New List(Of Integer)()value or expression? ' variable definition4 Console.WriteLine(n.reduce(eL, Function (nR As List(Of Integer), m As Integer) nR.withPrepend(m))arguments?) ' print5 End Sub
public class Global {

+static void main() { 1 var nname? = [2, 3, 5, 7, 11, 13]value or expression?;2 var nRname? = new List<int>()value or expression?;3 var eLname? = new List<int>()value or expression?;4 System.out.println(n.reduce(eL, (List<int> nR, int m) -> nR.withPrepend(m))arguments?); // print5 } // main
}








[13, 11, 7, 5, 3, 2]

   ● To reverse the order of the words in a StringstrstringStringString, use reduce on a ListlistListListList of words (created by split and then reassembled by join):

+main 1 variable sname? set to "'Twas brillig and the slithy toves"value or expression?2 variable sRname? set to ""value or expression?3 variable eLname? set to new List<of String>()value or expression?4 reassign sRvariableName? to s.split(" ").reduce(eL, lambda sR as List<of String>, word as String => sR.withPrepend(word)).join(" ")value or expression?5 print(sRarguments?)6 end main
+def main() -> None: 1 sname? = "'Twas brillig and the slithy toves"value or expression? # variable definition2 sRname? = ""value or expression? # variable definition3 eLname? = list[str]()value or expression? # variable definition4 sRvariableName? = s.split(" ").reduce(eL, lambda sR: list[str], word: str: sR.withPrepend(word)).join(" ")value or expression? # reassign variable5 print(sRarguments?)6 main()
+static void main() { 1 var sname? = "'Twas brillig and the slithy toves"value or expression?;2 var sRname? = ""value or expression?;3 var eLname? = new List<string>()value or expression?;4 sRvariableName? = s.split(" ").reduce(eL, List<string> sR, string word => sR.withPrepend(word)).join(" ")value or expression?; // reassign variable5 Console.WriteLine(sRarguments?); // print6 } // main
+Sub main() 1 Dim sname? = "'Twas brillig and the slithy toves"value or expression? ' variable definition2 Dim sRname? = ""value or expression? ' variable definition3 Dim eLname? = New List(Of String)()value or expression? ' variable definition4 sRvariableName? = s.split(" ").reduce(eL, Function (sR As List(Of String), word As String) sR.withPrepend(word)).join(" ")value or expression? ' reassign variable5 Console.WriteLine(sRarguments?) ' print6 End Sub
public class Global {

+static void main() { 1 var sname? = "'Twas brillig and the slithy toves"value or expression?;2 var sRname? = ""value or expression?;3 var eLname? = new List<String>()value or expression?;4 sRvariableName? = s.split(" ").reduce(eL, (List<String> sR, String word) -> sR.withPrepend(word)).join(" ")value or expression?; // reassign variable5 System.out.println(sRarguments?); // print6 } // main
}










toves slithy the and brillig 'Twas
   Note

maxBy and minBy

maxBy and minBy are dot methods on a ListlistListListList. They take a function as an argument, and return the list item corresponding to the maximum or minimum of the values returned by the function.

For simply finding the maximum or minimum value in a ListlistListListList, you can use max , min .

Examples using maxBy and minBy

   ● To find in a list the integer that has the highest last digit:

+main 1 variable aname? set to [33, 4, 0, 92, 89, 55, 102]value or expression?2 print(a.maxBy(lambda x as Int => x mod 10)arguments?)3 end main
+def main() -> None: 1 aname? = [33, 4, 0, 92, 89, 55, 102]value or expression? # variable definition2 print(a.maxBy(lambda x: int: x % 10)arguments?)3 main()
+static void main() { 1 var aname? = [33, 4, 0, 92, 89, 55, 102]value or expression?;2 Console.WriteLine(a.maxBy(int x => x % 10)arguments?); // print3 } // main
+Sub main() 1 Dim aname? = {33, 4, 0, 92, 89, 55, 102}value or expression? ' variable definition2 Console.WriteLine(a.maxBy(Function (x As Integer) x Mod 10)arguments?) ' print3 End Sub
public class Global {

+static void main() { 1 var aname? = [33, 4, 0, 92, 89, 55, 102]value or expression?;2 System.out.println(a.maxBy((int x) -> x % 10)arguments?); // print3 } // main
}




89

   ● To find in a list the the shortest string:

+main 1 variable fruitname? set to ["apple", "orange", "pear"]value or expression?2 print(fruit.minBy(lambda x as String => x.length())arguments?)3 end main
+def main() -> None: 1 fruitname? = ["apple", "orange", "pear"]value or expression? # variable definition2 print(fruit.minBy(lambda x: str: x.length())arguments?)3 main()
+static void main() { 1 var fruitname? = ["apple", "orange", "pear"]value or expression?;2 Console.WriteLine(fruit.minBy(string x => x.length())arguments?); // print3 } // main
+Sub main() 1 Dim fruitname? = {"apple", "orange", "pear"}value or expression? ' variable definition2 Console.WriteLine(fruit.minBy(Function (x As String) x.length())arguments?) ' print3 End Sub
public class Global {

+static void main() { 1 var fruitname? = ["apple", "orange", "pear"]value or expression?;2 System.out.println(fruit.minBy((String x) -> x.length())arguments?); // print3 } // main
}




pear

orderBy

orderBy takes a lambdalambdalambdalambdalambda that has two arguments of the same type as that of the ListlistListListList items to be re-ordered and compares them, returning a Boolean value that distinguishes between less than (or greater than) for numerics and before (or after) for strings.

Examples using orderBy

   ● To reorder integers in a ListlistListListList, using > for ascending (you would use < for descending):

variable numbersname? set to [27, 2, 3, 5, 7, 31, 37, 11, 23, 13, 19, 23]value or expression?0
numbersname? = [27, 2, 3, 5, 7, 31, 37, 11, 23, 13, 19, 23]value or expression? # variable definition0
var numbersname? = [27, 2, 3, 5, 7, 31, 37, 11, 23, 13, 19, 23]value or expression?;0
Dim numbersname? = {27, 2, 3, 5, 7, 31, 37, 11, 23, 13, 19, 23}value or expression? ' variable definition0
var numbersname? = [27, 2, 3, 5, 7, 31, 37, 11, 23, 13, 19, 23]value or expression?;0






[2, 3, 5, 7, 11, 13, 19, 23, 23, 27, 31, 37]

   ● To reorder strings in a ListlistListListList, using method isBefore for descending (you would use isAfter for ascending):

+main 1 variable namesname? set to ["Simon", "Pauline", "Jason", "Zelda", "Edith", "Lance", "Alice", "Paul"]value or expression?2 print(names.orderBy(lambda x as String, y as String => x.isBefore(y))arguments?)3 end main
+def main() -> None: 1 namesname? = ["Simon", "Pauline", "Jason", "Zelda", "Edith", "Lance", "Alice", "Paul"]value or expression? # variable definition2 print(names.orderBy(lambda x: str, y: str: x.isBefore(y))arguments?)3 main()
+static void main() { 1 var namesname? = ["Simon", "Pauline", "Jason", "Zelda", "Edith", "Lance", "Alice", "Paul"]value or expression?;2 Console.WriteLine(names.orderBy(string x, string y => x.isBefore(y))arguments?); // print3 } // main
+Sub main() 1 Dim namesname? = {"Simon", "Pauline", "Jason", "Zelda", "Edith", "Lance", "Alice", "Paul"}value or expression? ' variable definition2 Console.WriteLine(names.orderBy(Function (x As String, y As String) x.isBefore(y))arguments?) ' print3 End Sub
public class Global {

+static void main() { 1 var namesname? = ["Simon", "Pauline", "Jason", "Zelda", "Edith", "Lance", "Alice", "Paul"]value or expression?;2 System.out.println(names.orderBy((String x, String y) -> x.isBefore(y))arguments?); // print3 } // main
}






[Zelda, Simon, Pauline, Paul, Lance, Jason, Edith, Alice]

Passing a function as a reference

To use a Higher-order Function (HoF), you have to pass in a reference to a function. This can be either a lambdalambdalambdalambdalambda or the name of a function. It is also possible to use references to functions not in the context of HoFs.

On most occasions when you write the name of an existing function elsewhere in code your intent is to evaluate the function and, to do so, you write the name of the function followed by round brackets containing such arguments as are required by the function. When passing a function, its name is not followed by round brackets (or arguments), as in this example:

+class PupilName? inheritance?1 property mathsPercentname? as IntType?2 +constructor(parameter definitions?) 3 new code end constructor +function toStringname?(parameter definitions?) returns StringType? 4 return "undefined"value or expression?5 end function end class +main 6 variable allPupilsname? set to new List<of Pupil>()value or expression?7 variable passesname? set to allPupils.filter(passedMathsTest)value or expression?8 end main +function passedMathsTestname?(p as Pupilparameter definitions?) returns BooleanType? 9 return p.mathsPercent > 35value or expression?10 end function
+class PupilName? inheritance? # concrete class1 mathsPercentname?: intType? # property2 +def __init__(self: Pupil) -> None: 3 new code +def toStringname?(self: Pupil) -> strType?: # function method4 return "undefined"value or expression?5 +def main() -> None: 6 allPupilsname? = list[Pupil]()value or expression? # variable definition7 passesname? = allPupils.filter(passedMathsTest)value or expression? # variable definition8 +def passedMathsTestname?(p: Pupilparameter definitions?) -> boolType?: # function9 return p.mathsPercent > 35value or expression?10 main()
+class PupilName? inheritance? {1 public intType? mathsPercentname? {get; private set;} // property2 +public Pupil(parameter definitions?) { 3 new code } // constructor +public stringType? toStringname?(parameter definitions?) { // function method4 return "undefined"value or expression?;5 } // function method } // class +static void main() { 6 var allPupilsname? = new List<Pupil>()value or expression?;7 var passesname? = allPupils.filter(passedMathsTest)value or expression?;8 } // main +static boolType? passedMathsTestname?(Pupil pparameter definitions?) { // function9 return p.mathsPercent > 35value or expression?;10 } // function
+Class PupilName? inheritance?1 Property mathsPercentname? As IntegerType?2 +Sub New(parameter definitions?) 3 new code End Sub +Function toStringname?(parameter definitions?) As StringType? 4 Return "undefined"value or expression?5 End Function End Class +Sub main() 6 Dim allPupilsname? = New List(Of Pupil)()value or expression? ' variable definition7 Dim passesname? = allPupils.filter(passedMathsTest)value or expression? ' variable definition8 End Sub +Function passedMathsTestname?(p As Pupilparameter definitions?) As BooleanType? 9 Return p.mathsPercent > 35value or expression?10 End Function
public class Global {

+class PupilName? inheritance? {1 public intType? mathsPercentname?; // property2 +public Pupil(parameter definitions?) { 3 new code } // constructor +public StringType? toStringname?(parameter definitions?) { // function method4 return "undefined"value or expression?;5 } // function method } // class +static void main() { 6 var allPupilsname? = new List<Pupil>()value or expression?;7 var passesname? = allPupils.filter(passedMathsTest)value or expression?;8 } // main +static boolType? passedMathsTestname?(Pupil pparameter definitions?) { // function9 return p.mathsPercent > 35value or expression?;10 } // function
}

System constants

System constants are unlike values that you define in your program constant , in that they are mutable named values, though it would be poor practice to change them.

String constants

These constants are of use when the characters { } and " are required within a string.

nameTypevalue
openBrace StringstrstringStringString   {
closeBrace StringstrstringStringString   }
quotes StringstrstringStringString   "

Maths constant

nameTypevalue
pi FloatfloatdoubleDoubledouble 𝜋 = 3.141592653589793..

Boolean constants

nameTypevalue
true BooleanboolboolBooleanbool trueTruetrueTruetrue
false BooleanboolboolBooleanbool falseFalsefalseFalsefalse

Colour constants

colourdecimaldecimal
hexadecimal
nameinteger   R    G    B 0xrrggbb
black 0   0    0    00x0000000x0000000x000000&H0000000x000000
white 16777215 255  255  2550xffffff0xffffff0xffffff&Hffffff0xffffff
red 16711680 255    0    00xff00000xff00000xff0000&Hff00000xff0000
green 32768  0  128    00x0080000x0080000x008000&H0080000x008000
blue 255   0    0  2550x0000ff0x0000ff0x0000ff&H0000ff0x0000ff
yellow16776960 255  255    00xffff000xffff000xffff00&Hffff000xffff00
brown 10824234 165   42   420xa52a2a0xa52a2a0xa52a2a&Ha52a2a0xa52a2a
grey 8421504 128  128  1280x8080800x8080800x808080&H8080800x808080
transparent -1n/an/a

A colour is specified as an IntintintIntegerint value using one of these methods:


Elan Library Reference go to the top