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


Arkady Klimov (klark@bagirra.rinet.ru)
Tue, 7 Dec 1999 16:52:28 +0300


----- Original Message -----
From: Andrey Slepuhin <pooh@msu.ru>
To: Arkady Klimov <klark@bagirra.rinet.ru>
Cc: Refal Plus mailing list <refal-plus@botik.ru>
Sent: Tuesday, December 07, 1999 1:41 PM
Subject: Re: Urgent!!! Help needed! Refal+ & virtual code

> 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 является то,
> > что они работают в обе стороны: позволяют как узнавать по имени
> > значение, так и по значению находить имя (первое попавшееся). При
> > выводе таблица используется для определения имени по значению.
>
> В Рефале+ таких таблиц нет и в этом вся проблема.
Их несложно реализовать на ящиках. В рефале-6 эти таблицы реализуются
просто списком пар: k1 v1 k2 v2 ... . Как я понял из нижеследующего, что-то
подобное ты уже сделал сам. Еще более проблематично, видимо, было то, что
пришлось, наверно, весь ввод писать самому на Рефале Плюс, не пользуясь
функцией READ, а пользуясь READ_LINE или READ_CHAR, да? Или эту проблему
удалось иначе обойти?

>
> > Теперь рассмотрим ввод.
> > В идеале,нужно для ввода иметь под рукой ту же таблицу, которая была
> > использована при выводе - тогде нет проблем.
> > Но даже если этой таблицы нет, все равно остается возможность
> > осуществить ввод так, чтобы одинаково поименованные внешние
> > символы-ссылки превратились в одинаковые
> > внутренние символы-ссылки и наоборот. Для этого будем осуществлять
> > ввод по следующему алгоритму.
> > Вначале для ввода создается свежая пустая таблица (или в нее
> > помещаются ассоциации, соответствующие окружению данного модуля).
> > Затем, когда вводится модуль и вводится очередной символ-ссылка, в
> > таблице ищется вхождение с этим именем. Если есть, все в порядке,
> > берем соответствующее значение. Если же нет, то создаем новую ссылку
> > (через <NEW>), помещаем информацию о ней в таблицу под своим именем, и
> > помещаем ее в результат.
> > В конце ввода в наших руках остается таблица, содержащая сведения о
> > всех введенных символах-ссылках.
>
> Вот-вот-вот. Пришлось примерно то же самое реализовывать в Рефале+.
> Теперь вроде все работает, но время пришлось потратить. Я-то надеялся,
> что может быть удастся обойтись без этого - не повезло :-(
>
> > Возможная проблема будет в том, что при вводе ссылки неизвестен ее
> > тип: BOX, STRING, FUNC или что еще. В рефале-6 она решается тем, что
> > есть универсальный тип символа-ссылки, символа, который, уже после его
> > создания (функцией <NEW>), может быть преобразован (без изменения
> > значения самой ссылки) в ссылку любого типа. Что-то подобное, наверно,
> > надо обеспечить и для Рефала Плюс, если это возможно.
>
> Здесь я пока не стал возиться с преобразованиями. Для работы с
> виртуальным
> кодом это реально не понадобится - нужно только ввести функцию, которая
> по ссылке достает ее имя.
>
> Всего доброго,
> Андрей.



This archive was generated by hypermail 2.0b3 on Tue Dec 07 1999 - 16:51:37 MSK