«Ох, бедный парсер :-) Выглядит неплохо, но на самом деле это получается не встроенная функция, а расширение синтаксиса.»
Снимать одновременно несколько линз одновременно, скорее всего, потребуется редко, поэтому создавать специальный синтаксис для этого неразумно, это верно. Можно добавить и встроенную функцию <| терм>, в дополнение ко встроенным функциям арифметики: <+ …>, <* …> и т.д. Либо скучная встроенная функция <Unlens терм>. «Также понятно, что вот я, например, давно перестал писать НА Рефале, потому что понимаю, что на других языках мне работать удобнее. И если выразительность Рефала существенно усилится, я с удовольствием снова на Рефал вернусь :-)» Существенно усилится вложенными функциями, словарями и линзами? Рефлексией в виде доступа к коду на чтение и запись во время выполнения? Или что-то ещё? Я долгое время разрабатывал (и, возможно, продолжу) компиляторы Рефала, т.к. их разработка ставит много интересных задач, прежде всего, по эффективной реализации всей этой выразительности. Вне этого я Рефалом почти не пользовался, т.к. нет библиотек и кучу всего базового приходится писать с нуля. Ну и плюс производительность. Ну и я бы не сказал, что код каких-то бытовых задач на Рефале будет компактнее кода на других языках, либо я пишу слишком «рыхло» с длинными именами переменных. From: Sergei Skorobogatov s.yu.skorobogatov_AT_gmail.com <[email protected]> Sent: Friday, November 15, 2024 2:56 PM To: [email protected] Subject: Re: Синтаксис словарей в Рефале! On Fri, Nov 15, 2024 at 9:40 AM Александр Коновалов a.v.konovalov87_AT_mail.ru <http://a.v.konovalov87_AT_mail.ru> <[email protected] <mailto:[email protected]> > wrote: «А, у вас компилятор заново строит результатное выражение, да? Т.е. если в образце — скобки, и в результатном выражении — скобки, то скобки в результатном выражении будут созданы заново? Тогда тяжело. В принципе, если навострить компилятор брать скобочные термы из образца и вставлять их (или их копию) в результатное выражение, то всё получится автоматически.» Смотря какой компилятор. <....> Если делать оптимизирующий компилятор с массивным представлением или представлением с подвешенными круглыми скобками, то семантику из предыдущего письма сделать будет проще. Ага, а в векторно-списковым представлении сборка результатных выражений из минимального количества фрагментов аргумента -- это вообще must have. При этом проблема разлучения круглых скобок не может возникнуть. On Fri, Nov 15, 2024 at 9:40 AM Александр Коновалов a.v.konovalov87_AT_mail.ru <http://a.v.konovalov87_AT_mail.ru> <[email protected] <mailto:[email protected]> > wrote: «4.3. Хотелось бы уметь переходить к оригинальным версиям термов в функциях, вызываемых из „линзированной“ функции. Как это сделать красиво, я не придумал.» <...> Я бы предложил использовать встроенную функцию с именем «|»: <| терм> — разлинзирует однократно, <|| терм> — двухкратно, <||| терм> — трёхкратно и т.д. Разлинзировать можно неограниченное количество раз, т.к. если линзы кончились, терм перестаёт меняться. Ох, бедный парсер :-) Выглядит неплохо, но на самом деле это получается не встроенная функция, а расширение синтаксиса. On Fri, Nov 15, 2024 at 9:40 AM Александр Коновалов a.v.konovalov87_AT_mail.ru <http://a.v.konovalov87_AT_mail.ru> <[email protected] <mailto:[email protected]> > wrote: Я правильно понял, что если линза трансформировала терм, то на выходе он восстановится, а если удалила, то уже нет? Да, так и есть. Хотя это не всегда то, чего хочется. К сожалению, я не придумал, как сделать по-другому без введения специального синтаксиса для написания линз. On Fri, Nov 15, 2024 at 9:40 AM Александр Коновалов a.v.konovalov87_AT_mail.ru <http://a.v.konovalov87_AT_mail.ru> <[email protected] <mailto:[email protected]> > wrote: Кстати, уже в третий раз замечаю, что Вы предпочитаете добавлять к объектным выражениям неявные атрибуты, т.е. невидимые для сопоставления с образцом <...> Недостаток неявных атрибутов в том, что выражения, сопоставимые с одноимёнными переменными, могут вести себя по-разному. Это усложняет программирование на языке и затрудняет написание оптимизирующих компиляторов. Программист вынужден учитывать, что где-то могут быть подвешены атрибуты, и писать код так, чтобы компилятор их не потерял. Это напоминает копирование переменных, но если копирование влияет только на эффективность, то потеря атрибутов (в случае функций и, особенно, в случае линз) может менять поведение программы. Учёт атрибутов также усложнит глубокие оптимизации, да и вообще генерацию кода. Да, есть такое дело. Я вообще люблю всё неявное и считаю, что оно того стоит. Хотя критику неявностей в языках программирования я понимаю и принимаю: неявности могут вызывать проблемы. Что касается усложнения преобразования кода, то я предполагаю, что в данной дискуссии мы обсуждаем добавление в Рефал возможностей, облегчающих жизнь программистам НА Рефале, а не программистам НАД Рефалом. Понятно, что все эти расширения языка -- функциональные термы, словари, линзы -- только портят жизнь программистам НАД Рефалом. Также понятно, что вот я, например, давно перестал писать НА Рефале, потому что понимаю, что на других языках мне работать удобнее. И если выразительность Рефала существенно усилится, я с удовольствием снова на Рефал вернусь :-)
