On Fri, Nov 15, 2024 at 9:40 AM Александр Коновалов a.v.konovalov87_AT_mail.ru <[email protected]> wrote:
> *«А, у вас компилятор заново строит результатное выражение, да? Т.е. если > в образце — скобки, и в результатном выражении — скобки, то скобки > в результатном выражении будут созданы заново? Тогда тяжело. В принципе, > если навострить компилятор брать скобочные термы из образца и вставлять их > (или их копию) в результатное выражение, то всё получится автоматически.»* > > Смотря какой компилятор. <....> > > Если делать оптимизирующий компилятор с массивным представлением или > представлением с подвешенными круглыми скобками, то семантику > из предыдущего письма сделать будет проще. > Ага, а в векторно-списковым представлении сборка результатных выражений из минимального количества фрагментов аргумента -- это вообще must have. При этом проблема разлучения круглых скобок не может возникнуть. On Fri, Nov 15, 2024 at 9:40 AM Александр Коновалов a.v.konovalov87_AT_mail.ru <[email protected]> wrote: > *«4.3. Хотелось бы уметь переходить к оригинальным версиям термов > в функциях, вызываемых из „линзированной“ функции. Как это сделать красиво, > я не придумал.»* > > <...> > > Я бы предложил использовать встроенную функцию с именем «|»: > > <| терм> — разлинзирует однократно, > <|| терм> — двухкратно, > <||| терм> — трёхкратно и т.д. > > Разлинзировать можно неограниченное количество раз, т.к. если линзы > кончились, терм перестаёт меняться. > Ох, бедный парсер :-) Выглядит неплохо, но на самом деле это получается не встроенная функция, а расширение синтаксиса. On Fri, Nov 15, 2024 at 9:40 AM Александр Коновалов a.v.konovalov87_AT_mail.ru <[email protected]> wrote: > Я правильно понял, что если линза трансформировала терм, то на выходе он > восстановится, а если удалила, то уже нет? > Да, так и есть. Хотя это не всегда то, чего хочется. К сожалению, я не придумал, как сделать по-другому без введения специального синтаксиса для написания линз. On Fri, Nov 15, 2024 at 9:40 AM Александр Коновалов a.v.konovalov87_AT_mail.ru <[email protected]> wrote: > Кстати, уже в третий раз замечаю, что Вы предпочитаете добавлять > к объектным выражениям неявные атрибуты, т.е. невидимые для сопоставления > с образцом <...> > > Недостаток неявных атрибутов в том, что выражения, сопоставимые > с одноимёнными переменными, могут вести себя по-разному. Это усложняет > программирование на языке и затрудняет написание оптимизирующих > компиляторов. Программист вынужден учитывать, что где-то могут быть > подвешены атрибуты, и писать код так, чтобы компилятор их не потерял. Это > напоминает копирование переменных, но если копирование влияет только > на эффективность, то потеря атрибутов (в случае функций и, особенно, > в случае линз) может менять поведение программы. Учёт атрибутов также > усложнит глубокие оптимизации, да и вообще генерацию кода. > Да, есть такое дело. Я вообще люблю всё неявное и считаю, что оно того стоит. Хотя критику неявностей в языках программирования я понимаю и принимаю: неявности могут вызывать проблемы. Что касается усложнения преобразования кода, то я предполагаю, что в данной дискуссии мы обсуждаем добавление в Рефал возможностей, облегчающих жизнь программистам НА Рефале, а не программистам НАД Рефалом. Понятно, что все эти расширения языка -- функциональные термы, словари, линзы -- только портят жизнь программистам НАД Рефалом. Также понятно, что вот я, например, давно перестал писать НА Рефале, потому что понимаю, что на других языках мне работать удобнее. И если выразительность Рефала существенно усилится, я с удовольствием снова на Рефал вернусь :-)
