Компилятор чего-то типа высокоуровнего в код программатора игры ШАХТЫ.
Программа состоит из "определений". Каждое определение --- это либо константа (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
.