Re: Urgent!!! Help needed! Refal+ & virtual code


Andrey Slepuhin (pooh@msu.ru)
Tue, 07 Dec 1999 13:41:34 +0300


Arkady Klimov wrote:
>
> ----- 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 Tue Dec 07 1999 - 13:43:38 MSK