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;
Ключевые слова - это предопределенные зарезервированные идентификаторы, которые имеют особое значение для компилятора.
Они не могут быть использованы в качестве идентификаторов. Ниже приведен список зарезервированных ключевых слов
fn
let
true false null
if else
while
return
Вы можете использовать встроенные функции для преобразования типов переменных
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]) // 3
let 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)
-> квадратный корень числа