Ограничение на функцию Purify, мне кажется, можно сформулировать и так: если в правой части стереть все вызовы функций, то должна получиться подстрока строки токенов образца.
А как компилятор должен отличать — в функции Parse терм получен от линзы (а значит, должен быть восстановлен после выхода из линзы) или создан заново? Если я запишу (Ident 'm_' e.Name) — в этот терм позиция добавится на выходе? Про гиперпараметры: если линзы добавляются в Рефал-7, то можно пользоваться каррированием — функция Purify получает гиперпараметры и возвращает функцию-линзу. <<Purify SkipComments> | Parse e.tokens>. Про отношение «выразительность/сложность». Сложность определяется не только длиной БНФ, но и описанием семантики. Семантика линз довольно таки непростая. From: Sergei Skorobogatov s.yu.skorobogatov_AT_gmail.com <[email protected]> Sent: Thursday, November 14, 2024 9:19 PM To: [email protected] Subject: Re: Синтаксис словарей в Рефале! On Thu, Nov 14, 2024 at 8:52 PM Александр Коновалов a.v.konovalov87_AT_mail.ru <http://a.v.konovalov87_AT_mail.ru> <[email protected] <mailto:[email protected]> > wrote: «При этом фрагменты образцов в результатных выражениях линзы не могут повторяться и должны сохранять своё взаимное расположение. Другими словами: линза всегда возвращает поддерево того упорядоченного дерева, которое передаётся ей в качестве аргумента. Это приводит к тому, что все термы на выходе линзы имеют ссылки на оригинальные термы, и эти ссылки назначаются тривиальным образом.» С этого и надо было начинать, это было не очевидно. И, согласен, это жёсткое ограничение. Я правильно понимаю, что относительный порядок сохраняться должен и в Purify, и в Parse? Purify -- линза. На неё наложено ограничение. У функции Parse никаких ограничений нет -- она может порождать новые термы, которые не входят в образцы, и располагать термы, полученные из линзы, произвольным образом, в том числе повторяя их любое количество раз. On Thu, Nov 14, 2024 at 8:52 PM Александр Коновалов a.v.konovalov87_AT_mail.ru <http://a.v.konovalov87_AT_mail.ru> <[email protected] <mailto:[email protected]> > wrote: «4.2. Хотелось бы передавать линзам гиперпараметры, управляющие их работой. Как их передавать, в принципе, понятно. Вот так, например: <Purify SkipComments | Parse e.tokens>. Но не совсем понятно, как отделить гиперпараметры от обрабатываемого дерева в реализации линзы — мешает накладываемое ограничение.» Не понял: SkipComments передаётся в Purify или в Parse? SkipComments передаётся в Purify, потому что расположено слева от вертикальной черты.
