Программирование
On-line приложения
Почитать
Web-сервер Apache
Печать и форматирование
MySQL
Разные рецепты
Сборка/установка
Справки
Философия
Мой опыт
Скачать
Программы на Tcl/Tk (GUI)
Программы на Python/Tk (GUI)
Программы (CLI)
Help
Хобби
Фракталы
on-line
Язык для рисования фракталов
Гиперкуб
Теория относительности
Ампуллярии
Преподавание
Студенту/абитуриенту
Мой опыт
Автора!

Описание Fact

Здесь приведено полное и исчерпывающее описание всех встроенных возможностей Fact. Оно немного суховато. Вы можете сперва прочитать неформальное введение с примерами и рисунками.

Общее описание

Язык Fact предназначен для визуализации итерационных фракталов и L-систем. Скачать интерпретатор вы можете здесь.

Синтаксис

Комментарии

Комментарии начинаются с символа # и заканчиваются символом конца строки. Комментарии игнорируются интерпретатором.

Токены (слова)

Программа состоит из слов, разделённых любыми пробельными символами. Слово может быть названием операции, именем переменной или числовым значением.

Регистр букв в токенах важен. Токены word, Word, WORd будут ссылаться на разные переменные или подпрограммы.

В качестве аргументов процедур могут использоваться константы или переменные.

Простые команды

Команды (далее я так же использую слова директивы, инструкции, процедуры) это последовательности токенов. Первый токен — имя операции — всегда однозначно определяет количество токенов в команде (поэтому в разделителях команд нет необходимости).

Имена операций всегда записывают маленькими буквами.

Блоки

Блоки команд начинаются с соответствующих инструкций (см. ниже) и заканчиваются словом end. Блоки могут быть вложен друг в друга. Пример:

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

Оператор stop останавливает выполнение программы и выдаёт диалоговое окно с указанием всех переменных и их значений.

Его удобно использовать для отладки.

Слово end

end

end

Слово end обозначает конец блока.

Оно так же может быть использовано в конце программы, тогда весь текст, следующий за end игнорируется.

Блоки, не имеющие закрывающего end автоматически закрываются в конце программы, но не стоит использовать это свойство. Это поведение может измениться в следующих версиях.

© 1999 − 2008 Мичурин Алексей — http://www.michurin.com.ru/