Компилятор чего-то типа высокоуровнего в код программатора игры ШАХТЫ.
Программа состоит из "определений". Каждое определение --- это либо константа (const),
либо функция (fn).
Пример определения константы:
const BLUE_CRYSTAL = 109;Функции бывают двух видов: встраиваемые (inline) и обычные. Встраиваемые функции
вставляются просто вставляются в вызывающий код, тем временем как вызов обычных функций
использует команды GOSUB / GOFUNC / GOSTATE
и RETURN / RETURN1 / RETURNSTATE.
Пример определения встраиваемой функции:
inline fn move_down_twice() {
move_down();
move_down();
}Определение обычных функций позвляет указывать тип вызова: без передачи
аргументов (см. GOSUB) - (), передача аргумента (см.
GOFUNC) - (arg), передача состояния (см. GOSTATE) - (state).
Примеры:
// Ничего не принимает
fn cycle() {
loop {
turn_left();
}
}
// Принимает аргумент и возвращает аргумент
fn is_wb(arg) -> arg {
return $CEL == 81;
}
// Ничего не принимает и возвращает состояние
fn select_forward_left() -> state {
select_forward();
selection_move_left_hand();
return;
}Аналогично с возвращаемым значением, это может быть ничего (см. RETURN), аргумент (см. RETURN1) и состояние (см. RETURNSTATE).
Тело каждой функции, в свою очередь, может состоять из следующего:
Пример ниже показывает, как сделать вечно крутящегося бота.
loop {
turn_left();
}Выполняет действия только если условие верно. Пример:
while $Y < 1000 {
move_down();
}Если условие верно --- выполняет ветку if, иначе else. Примеры:
// Только одна ветка, если условие неверно --- не делать ничего.
if low_hp() {
quit();
}
// Если условие верно -- первая ветка, иначе -- вторая.
if $DIR == 0 {
turn_left();
} else {
turn_right()
}
// Можно составлять цепочку из условий, тогда будет выполнено только какое-то
// одно из них:
if $LOA > 90 {
do_something();
} else if $LOA > 50 {
do_something_different();
} else {
go_mine();
}Все просто: имя, скобки, точка с запятой.
move_up();Можно вернуть выражение, подобное тому, что можно передать как условие для if или while. Примеры:
// Просто вернуться. В зависимости от типа возвращаемого значения, указанного в
// определении функции, будет использована соответствующая команда.
return;
// Вернуть булевое значение (потом эту функцию можно будет использовать как
// условие). Для этого тип возвращаемого значения должен быть `arg` или `state`.
return $CEL == 50;Пример:
// Выбрать клетку впереди нас.
__code__("[F]");Условием для операторов if и while (а также тем, что может возвращать
return) могут быть следующие вещи:
Число может быть заранее объявленной константой, или же явным значением. Примеры:
if $CEL == 51 { ... }
return $HPP < 70;Функция должна быть inline либо возвращать arg или state. Пример:
if low_hp() { ... }Каждая программа должна определять функцию main. Исполнение программы начнется с этой функции.
По умолчанию компилятор компилирует исходный код вместе со стандартной библиотекой (исходный код
которой на данный момент лежит тут). Если вы не хотите этого --- воспользуйтесь флагом --nostdlib.