Лямбда-исчисление в рефале


Subject: Лямбда-исчисление в рефале
From: Mike Potanin (potanin@mccme.ru)
Date: Mon Aug 27 2001 - 13:38:07 MSD


 С моей точки зрения очень неестественно то что в функциональном языке
не поддерживается лямбда-исчисление. Может это вызладет как попытка
сделать из рефала haskell, но я решил расширить рефал в порядке
эксперемента. В общем то добавилась всего одна существенная конструкция (и
одна дополнительная для оптимизации) и расширилась семантика функции Mu.
Я добавил к существующим типам (символ, целое и терм) еще один -
замыкание (closure). Синтаксис естественный
Adder {
 s1 = { s2 = <Add s1 s2>; };
}
И с замыканием можно работать функцией Mu
 <Mu <Adder 1> 2>
Второе расширение не принципиально - замыкания можно использовать вместо
имени функции
 <{ s2 = <Add 1 s2>; } 2>
эквивалентно
 <Mu { s2 = <Add 1 s2>; } 2>
но у меня реализованно немного эффективней (и на пол-часа раньше :-)).
Что же это дает?
Во первых это покрывает with-блок
 e1, e1 : { блок };
полностью эквивалентно
 e1 = <{ блок } e1>
и по моему немного естественней.
Во вторых функции - достаточно общий объект, и через него можно
реализовать произвольные структуры, например атрибутированный набор.
Person {
 (e1) (e2) = { 'name' = e1; 'secondname' = e2; };
}
Работать с такими объектами по моему удобнее, чем таскать за собой сложную
структуру. (В прочем это субъективно, возможно это привычка пришла из
scheme и была усилена haskell, а в рефале она лишняя).

Хотя мне такое расширение нравится, все-таки возникли вопросы.
На сколько это усложнит суперкомпиляцию (мне кажется что в языке стоит
оставлять только те конструкции, для которых суперкомпиляция эффективна)?
Создает ли это проблемы для введения в рефал статической типизации?

P.S. Исходный текст этой эксперементальной реализации лежит
http://pm.kmost.express.ru/~pm/hrefal.tgz
Слиль в них плохой (первая моя программа на haskell), но
поэксперементировать можно. Накоплю опыта, я ее с нуля перепишу.



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