О языке
Folders — нетекстовый язык программирования, где код выражается в структуре контейнеризации и порядке элементов. Имена папок игнорируются, кроме их алфавитного упорядочивания. По сути, это чистые упорядоченные деревья.
Идея вдохновлена языком Whitespace и посвящена концепции демaterialизованного кода. Она возникла из вопроса: что может быть пустотнее файла без видимого текста? Пустая папка — это беспорядок, придаток без назначения. В git она полностью игнорируется (поэтому рекомендуется помещать .gitignore файлы в глубочайшие слои Folders программ).
Язык начинался как Windows-решение. На Windows папки представляют собой ещё более экстремальную меру пустотности: они вообще не занимают место на диске. В качестве доказательства можно создать 352 449 папок и проверить свойства — результат покажет 0 байт. Таким образом, Folders предлагает не только демaterialизованный подход к коду, но и бесконечную ёмкость хранилища. Кодируйте все данные в именах папок и никогда не беспокойтесь о нехватке места.
Для пользователей других операционных систем ниже доступен эмулятор, который даёт представление о том, как Folders управляет данными и кодом.
Кодирование
Каждая командная папка имеет по крайней мере одну дочерню папку. Количество подпапок в первой папке (в алфавитном порядке) указывает тип команды; любые аргументы указываются во второй папке; некоторые команды требуют третью папку. Выражения работают аналогично: количество папок в первой подпапке определяет тип выражения. Полная спецификация языка приведена ниже.
Временные данные хранятся в виде папок; в отличие от кода Folders, здесь роль играет именно имя папки.
Folders FS
Интерпретатор Folders не создаёт временные файлы; всё, что не хранится непосредственно в оперативной памяти, сохраняется как набор временных папок. В отличие от кода Folders, имя папки хранит сами данные. Предпочитаемый I/O в Folders — это другой набор папок. Это означает, что можно кодировать все данные в папки, полностью минуя «материальный мир» файлов и получая бесконечное дисковое пространство (используйте на собственный риск). Folders lang для кода, Folders FS для хранилища данных.
Визуализация
Программа на Folders — это nil-terminated nested list (завершённый нулём вложенный список). В своей простейшей форме это чистая контейнеризация и порядок, как в этом полностью массивном JSON:
[[[[],[]],[],[[]]],[[[],[]],[],[[],[]]],[[[],[]],[],[[],[],[]]],[[[],[]],[],[[],[],[],[]]],[[[],[],[]],[[]],[[[],[],[],[],[]],[],[[[],[],[],[]]]]],[[[],[],[]],[[],[]],[[[],[],[],[],[]],[],[[[],[],[],[[]]]]]],[[[],[],[]],[[],[],[],[]],[[[],[],[],[],[]],[],[[[],[],[],[]]]]],[[[]],[[[],[],[],[],[],[],[],[]],[[],[[],[],[],[]]],[[[],[],[],[],[]],[],[[[],[],[],[[]]],[[[]],[[]],[[]],[]]]]],[[[[],[],[],[]],[[],[[]]]],[[[],[],[],[]],[[[],[],[],[],[]],[[],[],[]],[[[[]],[],[[]],[]]]]],[[[],[],[]],[[],[],[]],[[[]],[[],[[]]],[[],[[],[]]]]],[[[],[],[]],[[]],[[],[[],[]]]],[[[],[],[]],[[],[]],[[],[[],[],[]]]],[[[],[],[]],[[],[],[],[]],[[[]],[[],[[],[],[],[]]],[[[],[],[],[],[]],[],[[[],[],[],[[]]]]]]]]]]
Так же JS-эмулятор сохраняет и читает программы на Folders.
Однако возможны и другие системы визуализации. Программы Folders — это содержание как структура и могут быть применены к сырым данным любого типа. Вот машина истинности (Truth Machine) как контурная карта. Более толстые линии — контейнеры, порядок папок читается начиная с верхнего левого угла (NW) и идёт против часовой стрелки.
Другие системы визуализации могут быть семейным деревом (со всеми одиночными родителями), ботанической структурой ветвления (как расщепляющийся стебель пшеницы) или путями через лабиринт.
Красные точки указывают порог от контейнера к одному потомку.
Спецификация языка
Это очень простой императивный язык с кратким списком семантических правил.
Для команд и выражений тип определяется количеством папок в их первой дочерней папке. Типы используются прямо.
Команды
| Команда | Количество папок | Детали |
|---|---|---|
| if | 0 папок | Вторая подпапка содержит выражение, третья — список команд |
| while | 1 папка | Вторая подпапка содержит выражение, третья — список команд |
| declare | 2 папки | Вторая подпапка содержит тип, третья — имя переменной (в количестве папок) |
| let | 3 папки | Вторая содержит имя переменной (в количестве папок), третья — выражение |
| 4 папки | Вторая подпапка содержит выражение | |
| input | 5 папок | Вторая подпапка содержит имя переменной |
Выражения
| Тип | Количество папок | Детали |
|---|---|---|
| переменная | 0 папок | Вторая подпапка содержит имя переменной |
| сложение | 1 папка | Вторая подпапка содержит первое выражение для сложения, третья — второе |
| вычитание | 2 папки | Вторая подпапка содержит первое выражение для вычитания, третья — второе |
| умножение | 3 папки | Вторая подпапка содержит первое выражение для умножения, третья — второе |
| деление | 4 папки | Вторая подпапка содержит первое выражение для деления, третья — второе |
| буквальное значение | 5 папок | Вторая подпапка содержит тип значения (например, две папки для строки, третья — значение) |
| равно | 6 папок | Вторая и третья папки содержат выражения для сравнения |
| больше чем | 7 папок | Вторая и третья папки содержат выражения для сравнения |
| меньше чем | 8 папок | Вторая и третья папки содержат выражения для сравнения |
Типы
| Тип | Количество папок |
|---|---|
| float | 1 папка |
| string | 2 папки |
| char | 3 папки |
Референсный компилятор доступен на GitHub.