Arkady Klimov (klimovark@mail.ru)
Mon, 6 Dec 1999 14:29:09 +0300
----- Original Message -----
From: Andrey Slepuhin <pooh@msu.ru>
To: Refal Plus mailing list <refal-plus@botik.ru>
Sent: Monday, December 06, 1999 1:37 PM
Subject: Urgent!!! Help needed! Refal+ & virtual code
> День добрый всем!
>
> Я практически закончил генерацию виртуального кода в текущем
Рефале+.
> Есть одна _большая_ проблема: хочется выдавать виртуальный код
> в виде объектного выражения, которое может быть потом опять считано.
> Однако в выводе есть символы-ссылки, например команда виртуального
кода
>
> PUSHQ &Some-Box
>
> запихивает на стек объектное выражение, состоящее из символа-ссылки
> Some-Box. Объектное выражение, содержащее символы-ссылки, в текущей
> реализации считано быть не может. Более того, я пока не очень хорошо
> представляю, во что это может быть преобразовано при вводе.
> Если есть какие-нибудь идеи на этот счет - просьба высказываться,
> я очень не хочу тянуть с выкладыванием новой версии.
>
> Всего доброго,
> Андрей.
>
Думаю, я могу предложить вариант решения - по прямой аналогии с тем,
как это сделано в Рефале-6. Там ведь тоже есть эта проблема - в
виртуальном коде (языке сборки) рефала-6 тоже константы записываются
сами собой, виртуальный код является выражением, которое выводится в
файл (текстовый) средствами вывода объектных выражений.
Символы ссылки выводятся так, как они записываются на рефале, в данном
случае -
PUSHQ &Some-Box
Речь идет о выводе функцией WRITE. Чтобы это было возможно функция
вывода должна иметь доступ к информации об имени, ассоциированном с
символом ссылкой. В рефале-6 эта ассоциация устанавливается при помощи
таблицы, где в качестве основного ключа выступает слово (имя), а
значение - символ-ссылка. Особенностью таблиц в Рефале-6 является то,
что они работают в обе стороны: позволяют как узнавать по имени
значение, так и по значению находить имя (первое попавшееся). При
выводе таблица используется для определения имени по значению.
Теперь рассмотрим ввод.
В идеале,нужно для ввода иметь под рукой ту же таблицу, которая была
использована при выводе - тогде нет проблем.
Но даже если этой таблицы нет, все равно остается возможность
осуществить ввод так, чтобы одинаково поименованные внешние
символы-ссылки превратились в одинаковые
внутренние символы-ссылки и наоборот. Для этого будем осуществлять
ввод по следующему алгоритму.
Вначале для ввода создается свежая пустая таблица (или в нее
помещаются ассоциации, соответствующие окружению данного модуля).
Затем, когда вводится модуль и вводится очередной символ-ссылка, в
таблице ищется вхождение с этим именем. Если есть, все в порядке,
берем соответствующее значение. Если же нет, то создаем новую ссылку
(через <NEW>), помещаем информацию о ней в таблицу под своим именем, и
помещаем ее в результат.
В конце ввода в наших руках остается таблица, содержащая сведения о
всех введенных символах-ссылках.
Возможная проблема будет в том, что при вводе ссылки неизвестен ее
тип: BOX, STRING, FUNC или что еще. В рефале-6 она решается тем, что
есть универсальный тип символа-ссылки, символа, который, уже после его
создания (функцией <NEW>), может быть преобразован (без изменения
значения самой ссылки) в ссылку любого типа. Что-то подобное, наверно,
надо обеспечить и для Рефала Плюс, если это возможно.
Всего наилучшего.
Аркадий.
This archive was generated by hypermail 2.0b3 on Mon Dec 06 1999 - 15:27:42 MSK