Лексикални променливи в 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++. Каним само професионалисти.