LINUX.ORG.RU

Ворос по раскрытию макросов

 


2

5

Допустим, я пишу новый, «более лучший лисп»(ТМ). Хочу реализовать простенькую макросистему. Мой экспандер анализирует исходник, находит макровызовы, раскрывает их, а дальше возникает вопрос. Что если код, в который раскрывается макрос, содержит еще один макровызов? Его нельзя раскрыть на данном этапе, поскольку еще нет разрешения имен. Значит, мне надо заэвалить все, а раскрывать когда? Скорей всего, когда данный вызов потребуется. Заэвалил, запускаю снова экспандер. вроде норм. Но что если результат 2 вызова требуется уже при первом выполнении? Заставлять пользователя явно указывать, в какой фазе раскрывать каждый макрос, или как?

Ответ на: комментарий от anonymous

Я готов к диалогу, но я не могу одно и то же объяснять по кругу. Лисп работает следующим образом. Есть какое-то внешнее представление (обычно это текст, но не обязательно). Вычислитель не обязан ничего знать про это внешнее представление, он вычисляет внутренние объекты Лиспа - формы. Внешнее представление преобразуется во внутреннее в результате процесса интернализации. Внешние имена (текст) преобразуются в символы (внутреннее представление имен) при помощи пакетов. Экстернализация (обратное преобразование) производится при помощи атрибута Name. Моя Лисп система при экстернализации символов ищет их в текущем пакете, который и определяет их текстовое представление. В рамках одного пакета должно соблюдаться условие: экстернализация(интернализация(x))=x.

komputikisto
()
Ответ на: комментарий от anonymous

Не могу отредактировать предыдущее сообщение. Диалог я немного не так написал. Может поэтому тебе трудно понять идею.

> standard-package   ; предопределенный пакет
<package standard-package>
> (setq x '(python ruby lisp))
(python ruby lisp)   ; печать относительно пакета standart-package
> (setq p (copy-package standard-package 'new-package))
<package new-package>
> (change-representation 'lisp "шепелявить" p)
... ; значение не имеет значения
> (change-representation 'python "пистон" p)
...
> (repl :package p) ; новый REPL со сменой пакета
>> x                ; приглашение к вводу отображает уровень REPL
(пистон ruby шепелявить) ; печать относительно пакета new-package
>> (exit)
> x
(python ruby lisp) ; печать относительно пакета standart-package
komputikisto
()
Ответ на: комментарий от komputikisto

Я готов к диалогу, но я не могу одно и то же объяснять по кругу.

Так ты ничего и не обяяснял ни разу. Только воду льешь.

Экстернализация (обратное преобразование) производится при помощи атрибута Name.

С чего ты взял? В name лежит имя символа, какое представление у этого имени - никто не знает. В каждом пакете может быть, конечно же, свое представление для этого имени. Ну по крайней мере во всех известных мне лиспах это так. Так что неясно чего ты там выдумал нового.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.