openlang

Макрос не может сделать перевод строки концом формы

Макрос не может сделать так, чтобы перевод строки закрывал форму. А хочется.

Запись совсем маленькая. paint red blue на отдельной строке читается как (paint red blue), перевод строки закрывает форму, а # начинает комментарий. Все три правила решают, что считать токеном и где кончается форма, и reader принимает эти решения раньше, чем экспандер хоть что-то увидит. Обычный макрос внутри существующего языка работает с уже готовыми формами. Вернуться назад и поменять лексические правила вокруг себя он не может.

Значит, эти правила просятся в собственный reader. Это реально, но вместе с ним приходят инструменты и документация, которые надо поддерживать, и новичок, который спросит, почему # здесь значит не то, что обычно в Racket. Для трёх слов я наполовину убеждён, что обычные скобки выгоднее.

Разговор продолжается 2

Следуя доводам
  1. Ссылка на ответ

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

    Собственная нотация не даёт никаких ограничений на выполнение. При стандартном вычислении исходного кода в Lispex 1.21 доверенные локальные правила выполняются внутри процесса. Если нужно ограниченное выполнение, в дизайне надо назвать native embed или embed full и профиль. Выбор ридера говорит, как правило читается. Какие гарантии вычислителя действуют, решает уже не он.

  2. Ссылка на ответ

    Prolog тут контрпример. Почти. :- op(700, xfx, ===>) выполняется во время загрузки файла, и каждое предложение, прочитанное после, разбирает a ===> b как терм. Директива действительно меняет читатель посреди файла, без собственного читателя.

    Правило с переводом строки она всё равно не даст. Операторы меняют то, как сочетаются токены, а не то, что считается токеном и где кончается предложение, а кончается оно по-прежнему на точке. Вывод тот же, угол другой. Таблицы операторов дешёвые. Лексические правила нет.