Язык программирования Fork
В порядке бреда. Идея заимствована из языка False.
Свойства языка
- Удобный (в смысле «быстро и качественно»)
- «Птичий» (минимум байтов — максимум инофрмации)
- Расширяемый
- С возможностью ООП и ФП
Идеи
- Классы символов: буквы и цифры, знаки, управляющие
Существуют цифры «+», «-», «.», «e», «h», «o», отличающиеся от соответствующих знаков и букв (способ отличия определяется реализацией Fork, например, с помощью дополнительного управляющего символа, спецсимвола из имеющихся в данной кодировке или путём предсказания при лексическом анализе)
- Последовательности букв и цифр слипаются в единый литерал
- Управляющие символы — пробельные и похожие на апостроф:
- пробельные символы и единичный перевод строки: разделитель
- двойной перевод строки и перевод страницы: «интерпретировать»
«`»: клей, все символы одного класса слипаются в литерал
«+-ab» — это три литерала («+», «-», «ab»), а «`+-*ab» — два («+-*», «ab»)
- одинарная и двойная кавычка: суперклей, все символы до парной кавычки слипаются в литерал (класса «буква и цифра»)
«\»: квотирование, следующий символ считается знаком
«\ =» — один литерал, а «\ab» — два
следствие: «\ » и « » — разные символы (они разных классов)
Стек — это дерево (точка ветвления называется узлом T)
в стеке хранятся необработанные входные литералы
когда ветка исчерпывается, вершиной стека становится самый левый лист поддерева T (сам T в случае пустого поддерева)
- Литералы и имена
- Литералы могут состоять из любых символов одного класса, кроме разделителей
Лиерал, нагруженный значением (например, в результате операции «.»), называется именем
Имена, начинающиеся на большую букву, считаются глобальными и хранятся в корневом T
- «неявные имена» (числовые константы, операторы Fork и пр.) считаются «хранящимися» в корне стека
Остальные имена хранятся в ближайшем T (глоальные имена — в корне стека) и уничтожаются месте с ним
При распознавании литерала просматривается список имён по всем T на пути из корня к текущей вершине стека
Нерешённые вопросы
Как работать с поддеревьями стека (а не с веткой до ближайшего T)?
- вариант: специальная операция дублирует не ветку, а наибольшее поддерево, если оно состоит из узлов без литералов (более точно: поднимаемся вверх по дереву до тех пор, пока на пути одни узлы, на последнем проверяем, состоит ли его поддерево из одних узлов, если да — дублируем, если нет — ошибка)
Хорошо бы уметь обрабатывать исключения (и оператор есть подходящий — «?»).
НЕ продуман ввод-вывод.
Таблица операторов Fork
Обозначения: «T» — узел стека, «L» — литерал (также L1, L2 и т. п.), «...» или «___» — отрезок пути от корня до вершины стека, «T (...) ...» — стек с двумя ветками (также «T (...) (...) ...» — стек с тремя ветками и т. п.).
Оператор |
Стек до |
Стек после |
Описание |
«:» |
L |
L L |
Сдублировать вершину стека |
«$» |
T ... |
T (...) ... |
Сдублировать ветку |
«.» |
T L ... |
T |
Сохранить ветку под именем L в узел T |
«,» |
|
T |
Создать узел |
«;» |
T ... L |
T (...) L |
Перенести вершину стека в новую ветку узла |
«!» |
T ... |
T _ |
Интерпретировать ветку |
«+» «-», «*», «/», «%» |
L1 L2 |
L3 |
Арифметические операции |
«&» «|» «~» |
L1 L2 |
L3 |
Логические операции |
«^» |
L1 L2 |
L3 |
Побитовая операция «стрелка Пирса» |