Описание 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>

end

if <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 автоматически закрываются в конце программы, но не стоит использовать это свойство. Это поведение может измениться в следующих версиях.


Комментарии запрещены.




Статистика