Abyss - это учебный язык, написанный на Go. Он имеет синтаксис в стиле C и в значительной степени вдохновлен Ruby, Python, Perl и C# Он поддерживает обычный поток управления и функциональное программирование.
Чтобы запустить REPL, просто введите следующую команду:
~ >> abyss
Hello, <username>! This is the Abyss programming language!
Feel free to type in commands
>>или запустить программу:
abyss path/to/file
Abyss поддерживает базовые типы данных: int, float, string, bool, array, hash, null
s1 = "Hello" + " world!"
i = 10
f = 10.0
b = true
a = [1, "2", "three"]
t = a[1 + 1 + 1]
h = {"a": 1, "b": [1, true]}
n = nullЧтобы создать переменную в Abyss используется ключевое слово let.
let a = [1, 2];
let b = "bob";
let c = true;Ключевые слова - это предопределенные зарезервированные идентификаторы, которые имеют особое значение для компилятора.
Они не могут быть использованы в качестве идентификаторов. Ниже приведен список зарезервированных ключевых слов
fnlettrue false nullif elsewhilereturn
Вы можете использовать встроенные функции для преобразования типов переменных
int()float()str()bool()
Условия в Abyss являются выражениями, поэтому их можно присвоить переменным.
let result = if (10 > 5) { true } else { false };
- if / if-else
- while
// if-else
let a = 10;
let b = 5;
if (a == b) {
print("a is equal to b");
} else {
print("a is not equal to b");
}
// while
let i = 0
while (i < 10) {
print(i);
i += 1;
}- Операторы сравнения:
<,<=,>,>=,==,!= - Унарные:
!,- - Арифметические:
+,-,*,/ - Присваивания:
=,+=,-=,*=,/=
В Abyss функции - это функции первого класса.
Это означает, что язык поддерживает передачу функций в качестве аргументов другим функциям,
возвращает их в виде значений из других функций и присваивает их переменным.
Также функции поддерживают замыкание!
// определить функцию
let add = fn(x) { x + 2; }; // return не обязателен
let a = [1, 2, add(1)];
print(a)
let complex = {
"add": fn(x, y) { return fn(z) { x + y + z } }, // функция с замыканием!
"sub": fn(x, y) { x - y },
"other": [1, 2, 3, 4]
}
print(complex["add"](1, 2)(3)) // 6
print(complex["sub"](1, 2)) // -1
print(complex["other"][2]) // 3let map = fn(arr, f) {
let iter = fn(arr, accumulated) {
if (len(arr) == 0) {
accumulated
} else {
iter(tail(arr), push(accumulated, f(first(arr))));
}
};
iter(arr, []);
};
let a = [1, 2, 3, 4];
let double = fn(x) { x * 2 };
print(map(a, double));Результат: [2, 4, 6, 8]
let reduce = fn(arr, initial, f) {
let iter = fn(arr, result) {
if (len(arr) == 0) {
result
} else {
iter(tail(arr), f(result, first(arr)));
}
};
iter(arr, initial);
};
let sum = fn(arr) {
reduce(arr, 0, fn(initial, el) { initial + el });
};
print(sum([1, 2, 3, 4, 5]));Результат: 15
len(arr)|len(str)-> вычисляет длинуfirst(arr)-> возвращает первый элемент массиваtail(arr)-> возвращает массив, без первого элементаlast(arr)-> возвращает последний элемент массиваpush(arr, value)-> добавляет элемент в массивarray(size, value)-> создает массив с указанным размером, где каждый элемент равен valuerange(a, b)-> возвращает массив с элементами от a, до bprint(value...)-> выводит на экран все аргументыabs(value)-> возвращает абсолютное значение числаpow(base, exp)-> возводит base в степень exp. Возвращает floatrandom()-> рандомное вещественное число в интервале[0.0, 1.0]sqrt(value)-> квадратный корень числа