Описание Fact: язык для рисования фракталов
Язык Fact предназначен для визуализации итерационных фракталов и L-систем.
Синтаксис
Комментарии
Комментарии начинаются с символа # и заканчиваются символом конца строки. Комментарии игнорируются интерпретатором.
Токены (слова)
Программа состоит из слов, разделённых любыми пробельными символами. Слово может быть названием операции, именем переменной или числовым значением.
Регистр букв в токенах важен. Токены word, Word, WORd будут ссылаться на разные переменные или подпрограммы.
В качестве аргументов процедур могут использоваться константы или переменные.
Простые команды
Команды (далее я так же использую слова директивы, инструкции, процедуры) это последовательности токенов. Первый токен — имя операции — всегда однозначно определяет количество токенов в команде (поэтому в разделителях команд нет необходимости).
Имена операций всегда записывают маленькими буквами.
Блоки
Блоки команд начинаются с соответствующих инструкций (см. ниже) и заканчиваются словом end (или else). Блоки могут быть вложены друг в друга. Пример:
local
repeat 5
…
end
end
Имена
Пространства имён переменных и подпрограмм разделены. То есть вы можете создать переменную и подпрограмму с одинаковыми именами. Это не приведёт к конфликтам.
Так же в качестве имён могу использоваться имена операций и даже числа.
Управление параметрами визуализации
color
color <r> <g> <b>
Команда устанавливает цвет, которым будут отрисовываться линии. Команда принимает три параметра, задающих насыщенность красного, зелёного и синего цветов, соответственно. Насыщенность изменяется от нуля до единицы. Если указана насыщенность больше единицы или меньше нуля, то она принимается равной единице или нулю, соответственно.
bgcolor
bgcolor <r> <g> <b>
Аналогична инструкции color, но устанавливает цвет фона.
width
width <w>
Устанавливает толщину линии в единицах текущей системы координат (см. ниже).
update
update
Инструкция не принимает никаких параметров. Она вызывает отображение промежуточного результата.
По умолчанию программа сперва выполняет все построения, а потом отображает результат. Если вы хотите видеть процесс построения, используйте команду update.
Преобразования системы координат
Все измерения длин, расстояний и толщин выполняются относительно текущей системы координат.
Изначально система координат расположена так: ось x направлена вдоль нижней грани области отображения, ось y направлена вдоль левой грани. Начало координат находится в левом-нижнем углу. Единица измерения равна стороне области отображения.
Таким образом координаты углов области отображения имеют следующие значения:
• левый-нижний — x=0, y=0
• правый-нижний — x=1, y=0
• левый-верхний — x=0, y=1
• правый-верхний — x=1, y=1
draw
draw <dx> <dy>
Перемещает систему координат на dx вдоль оси x и dy вдоль оси y. Перемещение происходит относительно текущей системы координат.
При перемещении вычерчивается линия. Толщина линии задаётся директивой width, цвет — color.
jump
jump <dx> <dy>
Аналогична draw, но линия не вычерчивается.
scale
scale <k>
Масштабирует систему координат. Единица измерения текущей системы координат умножается на k.
right
right <a>
Поворачивает систему координат на a градусов по часовой стрелке. Аргумент может быть отрицательным, тогда поворот происходит в противоположном направлении.
left
left <a>
Аналогична right, но поворачивает против часовой стрелки.
Переменные
set
set <name> <val>
Присваивает переменной с именем name значение val. В качестве val может быть указано имя другой переменной.
Имена переменных могут быть любыми. В качестве имён можно использовать названия операций (например left), это не приводит ни к каким недоразумениям.
Теоретически, имя переменной может быть даже числом, но трудно представить веские основания для такого именования переменных.
Просмотреть текущие значения переменных позволяет команда stop (см. ниже).
Операции с числами
add
add <name> <val>
Прибавляет к значению переменной name значение константы или переменной val.
mul
mul <name> <val>
Умножает значение переменной name на значение константы или переменной val.
Циклы
repeat
repeat <n>
…
end
Повторяет n раз операции, заключённые в блоке repeat-end.
Подпрограммы
def
def <name>
…
end
Объявляет подпрограмму (макрос) с именем name.
Подпрограмма должна быть определена до первого вызова. Рекурсивный вызов допускается.
call
call <name>
Вызывает подпрограмму с именем name.
Условные переходы
if, else
if <v1> <op> <v2>
…
endif <v1> <op> <v2>
…
else
…
end
Оператор проверяет условие и выполняет соответствующий блок. Операнды v1 и v2 — числа или имена переменных, требующие сравнения; op может иметь одно из двух значений lt или gt — «меньше» или «больше», соответственно.
Если выражение <v1> <op> <v2> истинно, то выполняется блок if-end (или if-else). В противном случае выполняется блок else-end (если таковой имеется).
Локализация контекста
local
local
…
end
Все изменения переменных и преобразования системы координат, произведённые внутри блока local-end, теряют свою силу за пределами блока.
Обратите внимание, что изменения цвета и толщины линий остаются в силе за пределами блока. Если вам необходимо локализовать и эти параметры, то используйте для их настройки переменные.
save
save
…
end
Эта инструкция аналогична local, но слабее. Она сохраняет только значения переменных. Все остальные изменения (в том числе и преобразования координат), произведённые в блоке команд save-end, сохраняют силу и за пределами блока. Такое сохранение полезно при кодировании L-систем (соответствующие примеры содержатся в дистрибутиве).
transform
transform
…
end
Противоположность save — сохраняет систему координат и только её.
Отладка
stop
Оператор stop останавливает выполнение программы и выдаёт диалоговое окно с указанием всех переменных и их значений.
Его удобно использовать для отладки.
Слово end
end
Слово end обозначает конец блока.
Оно так же может быть использовано в конце программы, тогда весь текст, следующий за end игнорируется.
Блоки, не имеющие закрывающего end автоматически закрываются в конце программы, но не стоит использовать это свойство. Это поведение может измениться в следующих версиях.