A C-like scripting language.
Here is a small program that iterates and prints the contents of a list:
list fruits = [
"apple",
"banana",
"pear",
"lemon"
];
iterate fruits with void @(string fruit) { print(fruit) };
Hermes can execute functions written in C. To load a function written in C, you can use the
dload
method, to load a function from a shared object file (.so
). Example:
dload("librequests.so", "httpget");
string response = httpget("http://example.org")
print(response)
Here, the
httpget
function was loaded from thelibrequests.so
file. Read more about how to write C methods for Hermes here.
Here is a list of implemented data types:
- list
- int
- bool
- float
- char
- string
- object
- source
list colors = [
"red",
"green",
"blue"
];
To add an item to a list:
list names = [];
names.add("john");
To remove an item from a list by index
list names = ["john"];
names.remove(0);
Everyone knows what an integer is.
int age = 22;
Everyone knows what a boolean is.
bool x = 10 > 3;
Everyone knows what a float is.
float x = 0.5;
char c = 'a';
Everyone knows what a string is.
string name = "John Doe";
Objects are sort of what you think they are.
object person = {
string name = "john";
int age = 22;
};
print(person.name);
Sources are basically objects that represents a parsed source code.
source s = include("examples/functions.he");
To have hermes interpret the source, simply use the built-in
visit
method:
visit(s);
Now you can also dump that source to a serialized
.dat
file using the built-inwad
method:
wad(s, "functions");
This will create a
functions.dat
file. To read the use case for these.dat
files, please read this.
- aprint
- include
- wad
- lad
- visit
- fopen
- fputs
- fclose
- input
- time
- free
Prints whatever you gives it, example:
print("hello world");
Prints the adress of a value, example:
object person = {string name = "John Doe";};
aprint(person);
Loads an external source file, example:
source s = include("examples/functions.he");
Writes an AST compound to disk, example:
source s = include("examples/functions.he");
wad(s, "functions");
This creates a
functions.dat
file.
Loads an AST compound from disk, example:
source s = lad("functions");
Visits and executes a source, example:
source s = include("examples/functions.he");
visit(s);
Opens a file, here is an example to read the contents of a file:
object file = fopen("examples/functions.he", "r");
string x = file.read();
print(x);
fclose(file);
Writes a string to file, example:
object file = fopen("myfile.txt", "w+");
fputs("hello world", file);
fclose(file);
Close file, example:
object file = fopen("myfile.txt", "w+");
fclose(file);
Read from user input, stdin:
string a = input("Say something: ");
print("You said: " + a);
Get current timestamp
object stamp = time();
print(stamp.seconds);
Deallocates a variable, example:
string x = "hello";
free(x);
To define an anonymous function, name it
@
; like this:
void somefunction(void func)
{
func();
}
somefunction(void @(){ print("Hello from anonymous function"); });
- new
- iterate
- break
- continue
- while
- for
object get_person(string name)
{
object o = {
string name;
};
o.name = name;
return o;
}
object person = new get_person("Hanna");
The
new
statement will always return a new address of whatever is to the right of the statement.
void char_iterator(char c)
{
print(c);
}
void list_iterator(string name)
{
print(name);
}
string x = "john doe";
list y = ["john", "sarah", "hannah"];
iterate x with char_iterator;
iterate y with list_iterator;
list fruits = ["banana", "apple", "pear"]
void fruit_iterator(string name, int index)
{
print(index);
}
iterate fruits with fruit_iterator;
int x = 0;
while (x < 10)
{
print(x);
x += 1;
}
for (int i = 0; i < 10; i+=1)
{
print(i);
}
- this
The
this
variable exists within local scopes. Accessingthis
within a function will return the address of that function:
void myfunc()
{
print(this);
}
myfunc(); // 0x55824ee44970
Accessing
this
within a function inside an object will return the address of the object:
object person =
{
void myfunc()
{
print(this);
}
}
person.myfunc(); // { object }
Hermes now also supports compositions like this:
int add_2(int x)
{
return x + 2;
}
int remove_1(int x)
{
return x - 1;
}
int mycomp(int x) =
add_2, remove_1;
int x = mycomp(10);
print(x);
This might not be obvious, but lists can contain any sort of value. Example:
list cool_stuff = [
"this is a string",
{ string x = "Wow, this is an object"; },
[
"a string in a list in a list"
]
];
To install Hermes on your system, simply run:
make && sudo make install
To use an extension please have a look at here