Добрый день, коллеги!
 
Поделюсь мыслью, показавшейся мне интересной.
 
Читая как-то информацию о Рефале в сети, наткнулся на упоминание отсутствия 
вложенных функций как недостатка языка. По ходу реализации оказалось, что это 
не вполне соответствует действительности и такой механизм есть, хотя он не 
вполне явный и требует некоторой доработки.
Я добавлю здесь небольшой текст из своего описания. Возможно, это будет 
интересно ещё кому-то.
 
Позволил себе поупражняться в изобретении наименований, если что-то уже было 
сделано на этот счёт до меня, но я не знаю об этом.
«Авторекурсия» — это вызов функцией самой себя, синтаксически выделяемой как 
«<<» вместо «<имя_функции». Никаких других «вольностей» в синтаксисе тут нет.
 
Отрывок:
При комбинации авторекурсии и идентификаторов добавляется удобное качество: 
локальные подфункции внутри одной функции, именуемые  клозами .
Под  клозом понимается группа строк паттерна, начинающаяся с одного и того же 
символа, предпочтительно идентификатора. При вызове функции с указанием 
конкретного идентификатора, набор обрабатываемых паттернов сократится до строк, 
начинающихся с этого идентификатора. Если каждый паттерн начинается с 
идентификатора, то функция будет натуральной кавер — функцией  ( НКФ ,  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
 
  • Реф... Александр Коновалов a . v . konovalov87_AT_mail . ru
    • ... Александр Коновалов a . v . konovalov87_AT_mail . ru
      • ... Arkady Klimov arkady . klimov_AT_gmail . com
        • ... Александр Коновалов a . v . konovalov87_AT_mail . ru
          • ... Yuri Klimov yuri_AT_klimov . net
            • ... Sergei M. Abramov
              • ... Александр Гусев gusev_aleksandr_AT_mail . ru
                • ... Александр Коновалов a . v . konovalov87_AT_mail . ru
                • ... Александр Гусев gusev_aleksandr_AT_mail . ru
                • ... Александр Коновалов a . v . konovalov87_AT_mail . ru
                • ... Sergei M. Abramov
                • ... Александр Коновалов a . v . konovalov87_AT_mail . ru
                • ... Andrei Klimov andrei_AT_klimov . net
                • ... Александр Коновалов a . v . konovalov87_AT_mail . ru
                • ... Andrei Klimov andrei_AT_klimov . net

Ответить