Лексикални променливи в Perl 6

Един от проблемите на програмирането е борбата с нарастващата сложност на програмите, тъй като обемът им се увеличава. Исторически това се решава чрез изолиране на отделни части от програми, чието взаимодействие една с друга е ограничено. Този подход работи на всички нива на програмиране – „разделяне на концепции“, „направете едно нещо и го направете добре“, BCNF, монади, процедури, класове, роли, модули. Всички те насърчават ограничаването на части от програмата, за да не се играе срещу комбинаториката. Най-простият пример за логическо разделение е лексикална променлива.

Какво е интересното в това? Perl направи това грешно от самото начало. По подразбиране обхватът на променливите в Perl 5 е модулна променлива, нещо като глобална променлива. Ако дефинирате нещо вътре в блока, то ще се вижда отвън.

В Perl 6 лексикалните променливи работят по подразбиране.

Добре, може би това ще ви помогне да хванете печатна грешка... Но основното предимство на това е, че ще работите с справедливи обхвати на променливи. И ще ви позволи да управлявате сложността на програмите.

Разбира се, Perl 5 не ви принуди да кодирате "правилно" или да използвате strict и предупреждения. Perl 5 обещаваше обратна съвместимост, а Perl 1 очевидно не беше предназначен за писане на сложни програми. Глобалните променливи в малки скриптове имат смисъл.

Perl 6 се опитва да ви помогне да започнете с малко и да добавите поддръжка за структуриране, докато вашите програми растат. В случай на променливи, това означава, че в скриптовете и модулите променливите са лексикални по подразбиране, но в едноредовите, извикани с -e, глобалните променливи остават.

Ако си мислите, че всичко за лексикалните променливи не е така. Има неочаквани бонуси за този подход. Обмислифункция:

Блокът от код се връща. С всяко извикване на counter, ние получаваме част от кода, който може да бъде извикан толкова пъти, колкото е необходимо.

Ето какво се случва, ако създадем две различни части от този код и си играем с тях:

виждаш ли $c1 и $c2 работят независимо. Всеки има състояние, съхранено под формата на променлива $count. За нас може да изглежда като една променлива, но за два различни екземпляра на counter, това са две различни области за съхранение на стойността - защото всеки път, когато влизаме отново в блока, отваряме нов обхват. Такъв блок се нарича затваряне.

Ако ви се стори, че затварянията са като леки предмети, поздравления, те са. Тяхната същност на ограничаване на достъпа е същата като тази на капсулирането и скриването на информация в TOE. Всичко това е необходимо, за да се ограничи полето на дейност, така че отделните части на програмата да могат да правят възможно най-малко неща.

Hardcore conf в C++. Каним само професионалисти.