← На главную

Код без строк: @@ и maj строят сумматор

22.07.2026 14:03 · hackernews

Выражения не обязаны читаться слева направо. Почему бы не записать a < b вертикально — a, под ней <, под ней b? Мы привыкли писать код в одномерной строке, но если IDE и парсер позволят, появляется второе измерение.

Рассмотрим оператор andFlip. На Python это функция: берёт три аргумента, и если первые два истинны, третий инвертируется. Записать её привычным инфиксным способом неудобно. Автор предлагает обозначить andFlip символом @@ и размещать по-другому. Вместо каррированной записи можно использовать вертикаль: a1 @@ a2, а ниже a3 — третий операнд. Так получается цепочка. Например, (x @@ y) переключает t1, а результат идёт на t1 @@ z, переключая t2. Это трёхсторонний переключатель: дверь курятника срабатывает, только когда фотометр пересёк порог (x), показания стабильны пять минут (y) и привод не дёргался недавно (z). Простое x and y and z не подходит — дверь вернулась бы обратно при снятии условия, а @@ меняет состояние один раз и фиксирует.

Такая запись требует изменяемого временного бита t1, но можно сымитировать чистую функцию, обнулив t1 внутри того же выражения. Это приводит к головоломкам. Сбросить t1 в ноль после вычислений удаётся повторением (x @@ y) ниже. Если же t1 изначально содержит мусорное значение n, восстановить его сложнее. Решение — четырёхкратное повторение строк: (x @@ y) @@ z, затем снова (x @@ y) @@ z под ними. Эта конструкция в точности повторяет квантовую схему CCCX и процедуру «uncomputation» заимствованного ancilla-кубита. Автор показывает ту же схему на Qiskit и утверждает, что двумерный синтаксис понятнее, чем отслеживание переменных в коде или традиционная цепная диаграмма.

Затем определяются новые операторы: @ (переворот цели при истинном условии) и maj — мажоритарный гейт. Через пространственную запись maj строится из @ и @@. Вместе с парным оператором uma он позволяет собрать трёхбитный сумматор в одном двумерном выражении. Цепочка maj идёт сверху, а uma снизу, вычисление и обратное очищение проводов объединяются вертикально. a-провода восстанавливаются, b-провода получают сумму, а c3 — выходной перенос.

Это не единственный эксперимент с пространственными языками. Befunge (1993) гоняет указатель инструкций по сетке. Orca — секвенсор для livecoding, где каждый символ-оператор читает соседей. В Racket #2dcond условие вычисляется по двум осям. Hexagony работает на шестиугольной решётке с шестью указателями. Ladder logic программирует ПЛК релейными строками с параллельными ветвями. И, конечно, самая успешная пространственная среда — электронные таблицы, где формула живёт в двумерной координате и ссылается на соседние ячейки.

Автор вспоминает гипотезу Сепира-Уорфа: язык формирует мышление. Терминал заставляет писать команды в строку, клавиатура — мыслить ASCII-символами. Осознание этих ограничений — как вода для рыбы, по выражению Дэвида Фостера Уоллеса в речи «This Is Water». Переосмысляя привычки, можно открыть новые идеи вроде двумерного синтаксиса.

Читать оригинал →