Добрый день, коллеги!
Поделюсь мыслью, показавшейся мне интересной.
Читая как-то информацию о Рефале в сети, наткнулся на упоминание отсутствия
вложенных функций как недостатка языка. По ходу реализации оказалось, что это
не вполне соответствует действительности и такой механизм есть, хотя он не
вполне явный и требует некоторой доработки.
Я добавлю здесь небольшой текст из своего описания. Возможно, это будет
интересно ещё кому-то.
Позволил себе поупражняться в изобретении наименований, если что-то уже было
сделано на этот счёт до меня, но я не знаю об этом.
«Авторекурсия» — это вызов функцией самой себя, синтаксически выделяемой как
«<<» вместо «<имя_функции». Никаких других «вольностей» в синтаксисе тут нет.
Отрывок:
При комбинации авторекурсии и идентификаторов добавляется удобное качество:
локальные подфункции внутри одной функции, именуемые клозами .
Под клозом понимается группа строк паттерна, начинающаяся с одного и того же
символа, предпочтительно идентификатора. При вызове функции с указанием
конкретного идентификатора, набор обрабатываемых паттернов сократится до строк,
начинающихся с этого идентификатора. Если каждый паттерн начинается с
идентификатора, то функция будет натуральной кавер — функцией ( НКФ , natural
cover) с гарантированной ясной логикой использования клозов .
Пример печати квадратов цепочки макроцифр:
Cover {
Square s.1 = <Mul s.1 s.1>;
Line = <Prout ' Конец списка '>;
Line e.1 = <Prout '=' e.1>;
= <<Line>;
s.1 = <<Line <<Square s.1>>;
s.1 e.1 = << s.1> << e.1>;
};
То же, но в «классическом» варианте:
Square {
s.1 = <Mul s.1 s.1>;
};
Line {
= <Prout ' Конец списка '>;
e.1 = <Prout '=' e.1>;
};
Cover {
= <Line>;
s.1 = <Line <Square s.1>>;
s.1 e.1 = <Cover s.1> <Cover e.1>;
};
НКФ можно даже оптимизировать на уровне выполнения — сократить перебор
вариантов без участия программиста на Рефале. Это вопрос на перспективу.
С уважением,
Александр Гусев
gusev_aleksa...@mail.ru