FractalPark
Язык FRM и совместимость

Изучите FRM в FractalPark

Узнайте, как канонические Definition FRM-like v1 обеспечивают опубликованные формулы Standard, а затем используйте отдельные примеры Editor, совместимые с Classic, не смешивая два контракта исходного кода.

01

Что такое FRM

FractalPark FRM-like v1 — канонический типизированный язык исходного кода для опубликованных Standard Definition. Definition закрепляет язык, стандартную библиотеку, NumericProfile, параметры, начальное состояние, повторяющийся шаг орбиты и предикат продолжения итерации.

Classic .frm вырос из экосистемы Fractint и остаётся контрактом исходного кода для отдельного Editor, совместимого с Classic, и конвейера import. FractalPark отдельно сканирует и диагностирует этот диалект; исходный код Classic и frmSemanticsVersion 1 или 2 не являются альтернативной записью канонического FRM-like v1.

Об истоках и истории более широкого проекта см. сайт проекта Fractint.

02

Поддержка FRM в FractalPark

Эта таблица совместимости описывает Editor и путь import, совместимые с Classic. Канонические опубликованные Standard Definition используют отдельно версионируемые parser FRM-like v1, типизированный IR, backend standard32 и фиксированную Safety Envelope.

УровеньЗначениеПроверенный охват
ПоддерживаетсяПокрыто тестами компилятора и пригодно к использованию без семантических оговорок.
  • Одно объявление формулы на исходный документ
  • секции init, loop и bailout
  • присваивания и пользовательские переменные
  • вещественные и комплексные литералы; арифметические, сравнительные, логические, унарные выражения и выражения величины
  • ветви if / elseif / else / endif
  • z, c, pixel, zPrev, p1–p5, константы и проверенные встроенные функции
  • комментарии FRM
  • структурированная диагностика и сопоставление исходного кода FRM с GLSL
АдаптированоПринимается с документированным семантическим отличием или как расширение FractalPark.
  • ismand соответствует текущему режиму выполнения Мандельброт/Жюлиа в FractalPark
  • fn1–fn4 используют диспетчеризацию функций на этапе компиляции
  • @mode: native, @default-view и @default-coloring — это расширения FractalPark; директивы по умолчанию действуют только в нативном режиме
Не поддерживаетсяНе сохраняется текущим компилятором или файловым рабочим процессом; отклоняется, а не молча переписывается.
  • выбор одной из нескольких формул в одном файле
  • автоматическое преобразование классических диалектов Fractint
  • произвольные директивы исходного кода
  • не-ASCII идентификаторы
  • пользовательские функции или макросы
  • возможности препроцессора
  • любые конструкции, отклоняемые текущим конвейером компиляции

Это проверенная базовая совместимость Classic, а не заявление о полной совместимости с Fractint. Её следует отличать от реестра публикаций Standard.

Проверенная совместимость

Эти показатели возможностей Classic-import взяты из версионированного манифеста совместимости: 588 целевых записей состоят из 579 прохождений strict-v2 и 9 документированных исключений; 117 отдельных записей исключены по стабильным причинам. В эти числа не входят опубликованные Definition FRM-like v1.

Целевые записи
588
Прохождения strict-v2
579
Документированные отступления
9
Исключены с указанием причин
117
Типы дескрипторов bailout
4
Встроенные функции
20

Дескрипторы bailout

  • C1
  • C2
  • C4R
  • C5

Стабильные причины отклонения

  • unknown-predicate
  • unknown-magnitude-form
  • threshold-not-loop-invariant
  • chained-logical

Встроенные функции

  • sin
  • cos
  • tan
  • sinh
  • cosh
  • tanh
  • exp
  • log
  • sqrt
  • abs
  • sqr
  • conj
  • flip
  • recip
  • cabs
  • real
  • imag
  • atan2
  • cosxx
  • cotanh

Параметры: p1, p2, p3, p4, p5 · Слоты функций: fn1, fn2, fn3, fn4

Манифест возможностей v1 · Строгая семантика v2

03

Анатомия формулы

Канонический FRM-like v1 и текущие примеры Classic Editor разделяют именованную формулу и идеи init, loop и bailout, но их полные грамматики различаются. В v1 семантические директивы и необязательный типизированный раздел parameters также являются частью Definition.

01

init:

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

02

loop:

Выполняется один раз за итерацию. Обновите z и любое состояние, необходимое следующей итерации.

03

bailout:

Возвращает условие продолжения орбиты. Когда оно становится ложным, точка вышла за пределы.

Названия секций структурны, а не являются комментариями: пропуск или опечатка в них приводит к диагностическому сообщению.

04

Руководство по синтаксису

Обе поверхности намеренно остаются небольшими. Приведённые ниже сводки описывают общие понятия; для канонических директив и типизированных параметров используйте действие Source опубликованного Formula Record, а для исходного кода Classic — диагностику Editor.

Объявление и секции
Заключите одну именованную формулу в фигурные скобки, затем напишите init:, loop: и bailout: в этом порядке.
Значения и переменные
Используйте вещественные числа, например 0.15, комплексные пары, например (0.05, -0.02), встроенные значения орбиты или собственные присвоенные переменные.
Выражения
Арифметические операции, степени, сравнения, логические операторы, унарные операторы, синтаксис величины |z| и проверенные комплексные функции можно комбинировать.
Управляющие конструкции
Используйте if, elseif, else и endif, когда обновление орбиты зависит от условия. Блоки должны быть сбалансированы.
Встроенные элементы
Основные имена включают z, c, pixel, zPrev, p1–p5, pi, e, maxit, ismand, fn1–fn4 и функции, покрытые тестами компилятора.
Комментарии и директивы
Комментарии с точкой с запятой документируют исходный код. Распознаваемые директивы @ настраивают нативное поведение FractalPark; неизвестные директивы не игнорируются молча.
05

Конвейер: FRM → AST → GLSL

FractalPark никогда не вставляет исходный текст в шейдер. Канонический исходный код v1 проходит через типизированный parser и backend CPU/GLSL; исходный код Classic Editor проходит через scanner, frontend выбранной записи, каноническую модель формулы и plugin compiler.

  1. 1

    Исходный код FRM

    Точный текст из редактора, вставки или локального файла является авторитетными входными данными.

  2. 2

    Токены лексера

    Лексер распознаёт имена, числа, операторы, маркеры секций, комментарии и директивы, сохраняя позиции в исходном коде.

  3. 3

    Разобранное AST

    Парсер строит структурированное дерево формулы и сообщает о некорректных объявлениях, выражениях и блоках управления.

  4. 4

    Проверка и каноническая форма

    Валидатор проверяет имена, типы, секции и поддерживаемую семантику перед созданием канонической формулы.

  5. 5

    GLSL и карта исходного кода

    Генерация кода создаёт шейдерные функции и фиксирует сопоставления сгенерированного GLSL с исходным кодом FRM.

  6. 6

    Плагин формулы

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

У каждого контракта исходного кода есть собственный путь реализации. Опубликованная среда выполнения Standard использует FRM-like v1; отдельный Editor и текущие примеры пользовательских формул используют путь, совместимый с Classic. Ни один из них не переключается на другой незаметно.

06

Пошаговые уроки

Это примеры Editor, совместимые с Classic, а не канонические Definition FRM-like v1. Они переходят от небольшой квадратичной формулы к параметрам и обратной связи с состоянием; каждый блок исходного кода взят из общего реестра Editor и компилируется во время тестов.

Урок 1

Стартовое множество Мандельброта

Простейшая формула времени убегания — удобна для первого знакомства со структурой init / loop / bailout.

В центре внимания: объявление и структура init / loop / bailout. Меняйте показатель степени или порог убегания только после того, как эта версия скомпилируется.

starter-brot.frm
StarterBrot {
init:
  z = 0
loop:
  z = z^2 + c
bailout:
  |z| < 4
}

Урок 2

Дрейф параметров

Демонстрирует слоты параметров p1 / p2 и разницу между cabs и |z|.

В центре внимания: слоты параметров p1 и p2, комплексный литерал и cabs(z) как явная функция величины.

parameter-drift.frm
ParameterDrift {
init:
  z = 0
loop:
  z = z^2 + c + p1 * 0.15 + p2 * (0.05, -0.02)
bailout:
  cabs(z) < 8
}

Урок 3

Эхо орбиты

Использует zPrev как память обратной связи и хорошо сочетается с раскраской orbitEcho для огибающих орбиты.

В центре внимания: zPrev как предыдущее состояние орбиты. Обратная связь добавляет память без введения второй вручную управляемой переменной состояния.

orbit-echo.frm
OrbitEcho {
init:
  z = pixel
loop:
  z = sqr(z) + zPrev * (0.30, -0.12) + pixel * (0.85, 0.0)
bailout:
  |z| < 48
}

Отдельный FRM Editor открывает эти примеры, совместимые с Classic и проверенные компиляцией, по стабильному ID. Исходный код формулы остаётся на текущей вкладке, пока вы не сохраните его в облачной библиотеке, и никогда не встраивается в URL. Это не активирует import или writers канонического v1.

07

Ошибки и диагностика

Компиляция останавливается на самой ранней небезопасной стадии и сообщает сообщения, привязанные к исходному коду. Отклонённая конструкция никогда не переписывается во что-то лишь похожее.

Лексические ошибки

Неожиданные символы и неподдерживаемые идентификаторы сообщаются с указанием строки и столбца.

Ошибки разбора

Некорректные секции, выражения или блоки управления диагностируются до семантической проверки.

Ошибки проверки

Неизвестные переменные, недопустимые присваивания, несоответствие типов и неподдерживаемая семантика не позволяют генерировать код.

Сопоставление исходного кода шейдера

Сгенерированный GLSL сохраняет сопоставления, позволяющие связать сбой компиляции шейдера с исходной позицией FRM.

Исправляя ошибку, начните с первого сообщения: более поздняя диагностика может быть следствием того же отсутствующего токена или недопустимого выражения.

08

Обмен и публикация

Написанная вами формула приватна, пока вы не решите иначе. Есть три способа её распространения — каждый явный, ни один не молчаливый.

  • Приватно по умолчанию

    Формулы хранятся в вашей облачной библиотеке и видны только вам. Сохранённые работы содержат копию исходного кода формулы внутри черновика, поэтому они всегда открываются в том виде, в котором вы их оставили.

  • Скачайте файл .frm

    Ваша формула — это обычный текст. Скачайте её из раздела «Мои формулы» в любое время и храните собственную копию — без запросов на экспорт и ожидания.

  • Опубликуйте работу, поделитесь исходным кодом

    Публикация работы, использующей вашу формулу, делает исходный код формулы общедоступным по лицензии MIT: любой может читать, копировать и развивать его. Страница сообщества показывает имя формулы из её метаданных и предлагает исходный код для скачивания. Для этой публикации действие необратимо.

Полный текст лицензии MIT находится на opensource.org.

09

Примеры, следующие шаги и ссылки

Посмотрите на рендерер в контексте

Откройте Обзор, чтобы сравнить поведение встроенных формул, раскраску, трансформации, анимацию и элементы управления экспортом, прежде чем писать собственную формулу.

Открыть Обзор

Используйте специальный FRM Editor для текущего рабочего процесса компиляции, предпросмотра, импорта и загрузки, совместимого с Classic. Он не принимает канонический исходный код FRM-like v1; изучайте опубликованный исходный код v1 через Formula Record и используйте действия Open или Remix этого Record, чтобы его запустить.

Ссылки

Исторический контекст и детали реализации указаны отдельными ссылками, чтобы руководство могло отличать наследие Fractint от текущего контракта компилятора FractalPark.