Лексичні змінні Perl 6

Одна з проблем програмування - боротьба зі складністю програм, що зростає, при зростанні їх обсягу. Історично вона вирішується шляхом ізолювання окремих частин програм, взаємодія яких друг з одним обмежена. Такий підхід діє на всіх рівнях програмування – «розподіл концепцій», «роби щось одне і роби це добре», BCNF, монади, процедури, класи, ролі, модулі. Усі вони заохочують обмеження частин програми, ніж грати проти комбінаторики. Найпростішим прикладом логічного поділу є лексична змінна.

Що ж у цьому цікавого? Із самого початку Perl поводився з цим неправильно. За умовчанням, область видимості змінних у Perl 5 – це змінна модуля, щось на кшталт глобальної змінної. Якщо ви визначите щось усередині блоку, воно буде видно зовні.

У Perl 6 лексичні змінні працюють за умовчанням.

Ну добре, може це допоможе зловити друкарську помилку ... Але головна перевага цього в тому, що ви працюватимете з чесними областями видимості змінних. І це дозволить вам керувати складністю програм.

Звичайно, Perl 5 не змушував вас програмувати правильно і не нав'язував використання strict і warnings. Perl 5 обіцяв забезпечувати зворотну сумісність, а Perl 1 явно був призначений для написання складних програм. Глобальні змінні в невеликих скриптах мають сенс.

Perl 6 намагається допомогти вам почати з малого і додавати підтримку структурування у міру зростання програм. У разі змінних це означає, що в скриптах і модулях змінні лексичні за замовчуванням, але в однострочниках, викликаних по-е, залишаються глобальні змінні.

Якщо ви думали, що з приводу лексичних змінних все це не так. У цьому підході є несподівані бонуси. Розглянемофункцію:

Повертається блок коду. При кожному виклику counter ми отримуємо шматочок коду, який можна викликати потрібну кількість разів.

Ось що станеться, якщо ми створимо два різні шматочки цього коду і пограємо з ними:

Бачите? $c1 та $c2 працюють незалежно. У кожного зберігається стан у вигляді змінної $count. Для нас вона може виглядати, як одна змінна, але для двох різних екземплярів counter це дві різні області зберігання значення – оскільки щоразу заново входячи в блок, ми відкриваємо нову область видимості. Такий блок називається замиканням.

Якщо вам здалося, що замикання схожі на полегшені об'єкти – вітаю це саме так. Їх суть обмеження доступу та ж, що в інкапсуляції та приховування інформації в ГО. Це все потрібно для обмеження поля діяльності, щоб окремі частини програми могли наробити якнайменше справ.

Хардкорна конфа за С++. Ми запрошуємо лише профі.