Re: О типизации рефальских выражений


Subject: Re: О типизации рефальских выражений
From: Mike Potanin (potanin@mccme.ru)
Date: Mon Aug 20 2001 - 11:55:56 MSD


On Sun, 19 Aug 2001, Mikhail Kovtun wrote:

> P.S. Представление графа в последнем примере, конечно, является "ужасным"
> с точки зрения времени исполнения функции: имея вершину, мы каждый раз
> ищем связанную с ней информацию -- вместо того, чтобы связать ее один раз
> при построении графа. В рефале одним из разумных способов представить
> граф является использование ящиков. Однако образцы не могут заглядывать в
> ящики, что усложняет программирование. Были ли какие-нибудь интересные
> мысли по этому поводу?
Использование "ящиков" с моей точки зрения не самое удачное решение. Во
первых это отход от функционального стиля. Во вторых, на сколько я помню,
суперкомпилятор это не любит (и по первой причине врядли полюбит).
Мне кажется имеет смысл более радикальное решение - расширить набор
элементарных вырожений произвольными объектами. Сейчас это символы и
числа. Я бы хотел иметь возможность помещать туда произвольный набор пар
аттрибут=значение, при этом операции с этими объектами не должны быть чем
то более общим чем работа с символами и числами. То есть должны быть
проверки на строгое равенство и на равенство фиксированных на момент
компиляции атрибутов (и конечно создание). Конечно это реализуется на
базовом рефале, но уж очень не эффективно. Имена и значения атрибутов по
моему можно считать атомарными и позволить компилятору выбирать для них
наиболее удобное представление. Кажется такое расширение решит указаную
проблему и допускает суперкомпиляцию.
Что касается типизации, то ее действительно не хватает. Я начал писать
интерпретатор рефала на haskell (пепрвая моя программа на этом языке), и
был очень удивлен что отладка сводится переводу сообщений об ошибках
компилятора :-). С рефалом у меня так не получилось.
Интерпретатор я начал писать, что бы проверить на сколько ревалу подойдет
ленивость. И здесь тоже возникла потребность в типизации. Например
сопоставление
Test {
 e.a '@' e.b = e.b;
}
Main {
 = <Test 'qwe' <F1> '@' <F2>>;
}
Позволяет отложить вычисление F2 до подходящего случая, но не позволяет
поступить так же с F1. Решить эту проблему можно задав тип F1, так что
компилятор мог бы понять что '@' не может встретится в том что вернет эта
функция. Другое решение - не гарантировать что сопоставится первое
вхождение '@' - приведет к несовместимости и может усложнить отладку.



This archive was generated by hypermail 2b25 : Mon Oct 25 2004 - 21:24:59 MSD