Built-in functions

Every variable or constant (simple or complex) has built-in functions. They can be accessed like any other function even on a literal. Every built-in function can be overriden.

nameof

nameof returns the name of a variable as a string. It can be used both with and without a parameter.

With parameter

Example

var a = 42
nameof(a) //returns 'a'; the nameof function of the `this` scope is called

Without parameter

Example

with console from std:io
console.nameof() //returns 'console'

type

type returns the type of an object as an atom.

Example

var a = 42
var b = "Hello world"
var c = true
a.type() //returns :int
b.type() //returns :string
c.type() //returns :bool
:ok.type() //returns :atom

equals

equals compares two values and returns true if they're equal and false if they're not.

Example

with list from std:collections
1.equals(2) //returns false
"Hello".equals("Hello") //returns true
var foo = list.of({1,2,3,4,5})
foo.equals(list.of({1,2,3,4,5})) //returns true

hash

For complex types (except protos), hash serializes the variable into a JSON, MD5-hashes the JSON string and returns it. For simple types, the MD5-hash of the string representation of the value is returned.

Example

var jd = User("John", "Doe")
jd.hash() //returns the MD5 of the JSONified User object
"Hello".hash() //returns the MD5 hash of "Hello"
9000.hash() //returns the MD5 hash of "9000"

toString

toString returns the string representation of any variable or literal. Objects or structs are serialized into JSON while simple types are just being converted to strings.

Example

with list from std:collections
list.of({1,2,3,4,5}).toString()
/*
returns:
[1,2,3,4,5]
*/
class Car
@public
var name
var models
end
end
class Person
let name string
var age int
var cars object::Car[]
end
Person("John",30,
{
Car("Ford",{"Fiesta", "Focus", "Mustang"}),
Car("Fiat",{"500", "Panda"})
}).toString()
/*
returns:
{
"name":"John",
"age":30,
"cars": [
{ "name":"Ford", "models":[ "Fiesta", "Focus", "Mustang" ] },
{ "name":"Fiat", "models":[ "500", "Panda" ] }
]
}
*/

send & self

send sends an object to the specified PID.

self returns the pid of the calling process.

Example

with msg from std:io
class Counter
private var int counter
func loop()
receive(m)
msg{state: :increment} => counter++
msg{state: :get, data := sender} => send(sender, counter)
end
end
func Counter()
counter = 0
end
end
var ctr = spawn({_ => Counter().loop()})
send(ctr, msg(:increment))
send(ctr, msg(:increment))
send(ctr, msg(:increment))
send(ctr, msg(:get, self()))
receive(m)
_ => console.out(m) //prints 3
end