Блоки — различия между версиями

Материал из Deeptown Manual
Перейти к: навигация, поиск
(http://oregov467.jugem.jp/?eid=4 Making Sandwiches movies online wiki Making Sandwiches Making Sandwiches cinema subtitles for Making Sandwiches download hd Making Sandwiches Making Sandwiches film re)
 
(не показаны 22 414 промежуточных версий 4 участников)
Строка 1: Строка 1:
http://oregov467.jugem.jp/?eid=4 Making Sandwiches movies online wiki Making Sandwiches Making Sandwiches cinema subtitles for Making Sandwiches download hd Making Sandwiches Making Sandwiches film reviews Making Sandwiches online forum your Making Sandwiches song in Making Sandwiches where to download Making Sandwiches film how to download a movie Making Sandwiches all Making Sandwiches games windows xp Making Sandwiches where to buy Making Sandwiches watch online download Making Sandwiches report Making Sandwiches movie bluray download Making Sandwiches film legally Making Sandwiches movie ending watch full Making Sandwiches movie in hd Making Sandwiches printables Making Sandwiches blog Making Sandwiches blu ray extended buy Making Sandwiches film cheap download movie Making Sandwiches in dvd download Making Sandwiches film in divx formats Making Sandwiches dvd blu ray Making Sandwiches two towers film song Making Sandwiches free Making Sandwiches episodes Making Sandwiches free trial which Making Sandwiches character are you subtitles Making Sandwiches Making Sandwiches showings Making Sandwiches oscar awards watch movie of Making Sandwiches download Making Sandwiches movie high quality download the film Making Sandwiches Making Sandwiches music download the original Making Sandwiches new Making Sandwiches series download of Making Sandwiches film Making Sandwiches first edition Making Sandwiches movies online wiki Making Sandwiches Making Sandwiches cinema subtitles for Making Sandwiches download hd Making Sandwiches Making Sandwiches film reviews Making Sandwiches online forum your Making Sandwiches song in Making Sandwiches where to download Making Sandwiches film how to download a movie Making Sandwiches all Making Sandwiches games windows xp Making Sandwiches where to buy Making Sandwiches watch online download Making Sandwiches report Making Sandwiches movie bluray download Making Sandwiches film legally Making Sandwiches movie ending watch full Making Sandwiches movie in hd Making Sandwiches printables Making Sandwiches blog Making Sandwiches blu ray extended buy Making Sandwiches film cheap download movie Making Sandwiches in dvd download Making Sandwiches film in divx formats Making Sandwiches dvd blu ray Making Sandwiches two towers film song Making Sandwiches free Making Sandwiches episodes Making Sandwiches free trial which Making Sandwiches character are you subtitles Making Sandwiches Making Sandwiches showings Making Sandwiches oscar awards watch movie of Making Sandwiches download Making Sandwiches movie high quality download the film Making Sandwiches Making Sandwiches music download the original Making Sandwiches new Making Sandwiches series download of Making Sandwiches film Making Sandwiches first edition
+
__TOC__
Skeleton Man ending analysis Skeleton Man online official site make Skeleton Man free youtube Skeleton Man part Skeleton Man producer how many Skeleton Man movies Skeleton Man camrip free Skeleton Man pictures Skeleton Man movie tickets where can i download Skeleton Man Skeleton Man top watch the entire film of Skeleton Man Skeleton Man film high quality watch full length Skeleton Man online Skeleton Man official names of characters in Skeleton Man Skeleton Man soundboard Skeleton Man full movie high quality part Skeleton Man film downloads Skeleton Man movie online megavideo Skeleton Man songs Skeleton Man 3d collection Skeleton Man rerelease Skeleton Man bluray hd dvd Skeleton Man Skeleton Man film poster Skeleton Man movie music Skeleton Man suite mp3 Skeleton Man blu ray release date buy Skeleton Man film Skeleton Man episode guide http://www.ign.com/blogs/callbivojol/?p=50 amp preview=true Skeleton Man ending analysis Skeleton Man online official site make Skeleton Man free youtube Skeleton Man part Skeleton Man producer how many Skeleton Man movies Skeleton Man camrip free Skeleton Man pictures Skeleton Man movie tickets where can i download Skeleton Man Skeleton Man top watch the entire film of Skeleton Man Skeleton Man film high quality watch full length Skeleton Man online Skeleton Man official names of characters in Skeleton Man Skeleton Man soundboard Skeleton Man full movie high quality part Skeleton Man film downloads Skeleton Man movie online megavideo Skeleton Man songs Skeleton Man 3d collection Skeleton Man rerelease Skeleton Man bluray hd dvd Skeleton Man Skeleton Man film poster Skeleton Man movie music Skeleton Man suite mp3 Skeleton Man blu ray release date buy Skeleton Man film Skeleton Man episode guide
+
 
The Knot movie awards play The Knot online free The Knot extended blu ray watch The Knot full film good quality The Knot download ipod The Knot series list The Knot actresses The Knot film sales The Knot scenes The Knot original The Knot movie cast The Knot songs list The Knot screenplay The Knot game review The Knot full lenght movie in dvd format download The Knot film now watch The Knot full film in hd watch movies The Knot The Knot pc cheats The Knot film to download The Knot 3d review The Knot online promotional code The Knot movie download mp4 remake The Knot film The Knot suite The Knot read along free The Knot game downloadable The Knot film online The Knot game The Knot video download The Knot chapter summaries download movie The Knot dvd The Knot oscar nominations The Knot songs free download all The Knot movies in order The Knot complete song from The Knot The Knot remote control preview for The Knot wiki The Knot film The Knot dvd extended edition rules for The Knot The Knot trailer release date play The Knot games The Knot full lenght film in dvd format The Knot 3d game http://tusuliso.blogg.se/2012/january/order-of-the-knot-2006-movies.html The Knot movie awards play The Knot online free The Knot extended blu ray watch The Knot full film good quality The Knot download ipod The Knot series list The Knot actresses The Knot film sales The Knot scenes The Knot original The Knot movie cast The Knot songs list The Knot screenplay The Knot game review The Knot full lenght movie in dvd format download The Knot film now watch The Knot full film in hd watch movies The Knot The Knot pc cheats The Knot film to download The Knot 3d review The Knot online promotional code The Knot movie download mp4 remake The Knot film The Knot suite The Knot read along free The Knot game downloadable The Knot film online The Knot game The Knot video download The Knot chapter summaries download movie The Knot dvd The Knot oscar nominations The Knot songs free download all The Knot movies in order The Knot complete song from The Knot The Knot remote control preview for The Knot wiki The Knot film The Knot dvd extended edition rules for The Knot The Knot trailer release date play The Knot games The Knot full lenght film in dvd format The Knot 3d game
+
Основной идеей при написании как процедурных, так и объектно-ориентированных программ является локализация (заключение) функционала в некоторой области: в функции, либо в методе. Таким образом получается, что программа состоит из множества функционально независимых частей, каждая из которых решает конкретную, достаточно узкую задачу. Такой подход позволяет скрыть детали реализации алгоритмов внутри этих частей, а "наружу" предоставить только интерфейс — совокупность способов взаимодействия данного функционального элемента с другими. В случае функции, под интерфейсом понимается совокупность ее параметров и возвращаемого значения; в случае классов — наборы методов и свойств.
lyrics La robe du soir La robe du soir hqrip La robe du soir oscars where to watch La robe du soir film hd dvd La robe du soir online La robe du soir free online games La robe du soir sign La robe du soir composer watch La robe du soir film download animated La robe du soir bluray La robe du soir download La robe du soir film hd La robe du soir music score La robe du soir where playing purchase movie online La robe du soir La robe du soir complete set La robe du soir vol dvd was La robe du soir real downloadable films La robe du soir online real La robe du soir episodes La robe du soir online film La robe du soir movie spoiler where can i buy La robe du soir movie La robe du soir pc La robe du soir movie trailers how to download La robe du soir movie La robe du soir cheats watch La robe du soir film in hd actors from La robe du soir La robe du soir length length of La robe du soir movie La robe du soir movie location La robe du soir last chapter new La robe du soir play La robe du soir online game watch movies online La robe du soir La robe du soir chapter summary buy La robe du soir online is there a La robe du soir uncut La robe du soir La robe du soir credits song La robe du soir volumes download the whole La robe du soir film La robe du soir online youtube list of La robe du soir characters http://dailybooth.com/blacpipers395/21852288 lyrics La robe du soir La robe du soir hqrip La robe du soir oscars where to watch La robe du soir film hd dvd La robe du soir online La robe du soir free online games La robe du soir sign La robe du soir composer watch La robe du soir film download animated La robe du soir bluray La robe du soir download La robe du soir film hd La robe du soir music score La robe du soir where playing purchase movie online La robe du soir La robe du soir complete set La robe du soir vol dvd was La robe du soir real downloadable films La robe du soir online real La robe du soir episodes La robe du soir online film La robe du soir movie spoiler where can i buy La robe du soir movie La robe du soir pc La robe du soir movie trailers how to download La robe du soir movie La robe du soir cheats watch La robe du soir film in hd actors from La robe du soir La robe du soir length length of La robe du soir movie La robe du soir movie location La robe du soir last chapter new La robe du soir play La robe du soir online game watch movies online La robe du soir La robe du soir chapter summary buy La robe du soir online is there a La robe du soir uncut La robe du soir La robe du soir credits song La robe du soir volumes download the whole La robe du soir film La robe du soir online youtube list of La robe du soir characters
+
 
illegal Saint movie download free Saint game download Saint film streaming high quality Saint encyclopedia Saint part Saint bluray release date Saint wallpapers Saint tsrip watch Saint film high quality poster Saint download Saint free showtimes Saint Saint movie now actor in Saint Saint games download download hd Saint when is the new Saint coming out download the movie Saint Saint fanclub free Saint episodes cheap Saint film Saint blu ray dvd Saint movie credits release date of Saint Saint people real Saint suit for sale characters in Saint Saint movie characters how to download fast Saint online Saint movie pics Saint series http://paedysfeeder.eklablog.com/saint-1997-short-film-movie-for-download-a29171547 illegal Saint movie download free Saint game download Saint film streaming high quality Saint encyclopedia Saint part Saint bluray release date Saint wallpapers Saint tsrip watch Saint film high quality poster Saint download Saint free showtimes Saint Saint movie now actor in Saint Saint games download download hd Saint when is the new Saint coming out download the movie Saint Saint fanclub free Saint episodes cheap Saint film Saint blu ray dvd Saint movie credits release date of Saint Saint people real Saint suit for sale characters in Saint Saint movie characters how to download fast Saint online Saint movie pics Saint series
+
Случается, что в работе некоторого алгоритма возникают четко определенные функциональные подсистемы, которые, однако, слишком зависимы от самого алгоритма, либо слишком просты для того, чтобы выделять их в отдельную функцию. В случае с C++ это все же приходится делать, даже если эта "минифункция" применяется всего в одном методе, но достаточное количество раз, чтобы программист не захотел копировать эти строки.
http://dailybooth.com/blacpipers395/21852297 full The Garden movie windows The Garden black watch fast The Garden ful film The Garden volume subtitles The Garden seasons The Garden on tv The Garden special extended edition The Garden filming soundtrack to The Garden The Garden ending analysis developing The Garden film the new The Garden The Garden blu ray extended edition is The Garden retarded The Garden on dvd download entire The Garden movie fast The Garden website pictures from The Garden all The Garden movies The Garden movie release codes for The Garden online The Garden dvd rapidshare The Garden suit blueprints The Garden megavideo The Garden sound button The Garden theater film The Garden fanfiction The Garden fanclub shop The Garden download fast The Garden movie legally how do i download movies The Garden The Garden free movie online The Garden online forum The Garden trailer leaked The Garden reversed watch The Garden online dvd quality The Garden best quotes buy The Garden blu ray images of The Garden The Garden 3d blueray The Garden times full The Garden movie windows The Garden black watch fast The Garden ful film The Garden volume subtitles The Garden seasons The Garden on tv The Garden special extended edition The Garden filming soundtrack to The Garden The Garden ending analysis developing The Garden film the new The Garden The Garden blu ray extended edition is The Garden retarded The Garden on dvd download entire The Garden movie fast The Garden website pictures from The Garden all The Garden movies The Garden movie release codes for The Garden online The Garden dvd rapidshare The Garden suit blueprints The Garden megavideo The Garden sound button The Garden theater film The Garden fanfiction The Garden fanclub shop The Garden download fast The Garden movie legally how do i download movies The Garden The Garden free movie online The Garden online forum The Garden trailer leaked The Garden reversed watch The Garden online dvd quality The Garden best quotes buy The Garden blu ray images of The Garden The Garden 3d blueray The Garden times
+
 
http://paedysfeeder.eklablog.com/movies-death-in-holy-orders-2003-tv-series-a29171577 mp3 download Death in Holy Orders Death in Holy Orders history Death in Holy Orders ultimate edition Death in Holy Orders movie to download full Death in Holy Orders movie posters about Death in Holy Orders online Death in Holy Orders tv show Death in Holy Orders game wiki characters from Death in Holy Orders playstation Death in Holy Orders real life Death in Holy Orders Death in Holy Orders playlist Death in Holy Orders download hd movies downloadable films Death in Holy Orders Death in Holy Orders game 3d watch Death in Holy Orders 2010 full movie windows Death in Holy Orders eternity Death in Holy Orders download free Death in Holy Orders livejournal Death in Holy Orders playset Death in Holy Orders actresses watch full version of Death in Holy Orders film Death in Holy Orders it filmography Death in Holy Orders online trial download Death in Holy Orders full length movie download Death in Holy Orders movie camrip actress in Death in Holy Orders buy Death in Holy Orders dvd download movie Death in Holy Orders hq Death in Holy Orders ending video Death in Holy Orders last Death in Holy Orders movies in order where to watch the whole Death in Holy Orders film all of Death in Holy Orders movies where can i buy Death in Holy Orders movie Death in Holy Orders film for sale cheapest Death in Holy Orders dvd mp3 download Death in Holy Orders Death in Holy Orders history Death in Holy Orders ultimate edition Death in Holy Orders movie to download full Death in Holy Orders movie posters about Death in Holy Orders online Death in Holy Orders tv show Death in Holy Orders game wiki characters from Death in Holy Orders playstation Death in Holy Orders real life Death in Holy Orders Death in Holy Orders playlist Death in Holy Orders download hd movies downloadable films Death in Holy Orders Death in Holy Orders game 3d watch Death in Holy Orders 2010 full movie windows Death in Holy Orders eternity Death in Holy Orders download free Death in Holy Orders livejournal Death in Holy Orders playset Death in Holy Orders actresses watch full version of Death in Holy Orders film Death in Holy Orders it filmography Death in Holy Orders online trial download Death in Holy Orders full length movie download Death in Holy Orders movie camrip actress in Death in Holy Orders buy Death in Holy Orders dvd download movie Death in Holy Orders hq Death in Holy Orders ending video Death in Holy Orders last Death in Holy Orders movies in order where to watch the whole Death in Holy Orders film all of Death in Holy Orders movies where can i buy Death in Holy Orders movie Death in Holy Orders film for sale cheapest Death in Holy Orders dvd
+
В других случаях, может возникнуть желание вынести некоторый функционал за пределы текущей функции, или даже предоставить программисту-пользователю возможность самому определить его.
movie The Ear trailer The Ear hd The Ear blu ray set is The Ear good The Ear full movie high quality buy The Ear bluray when does the new The Ear come out watch The Ear movie on computer official The Ear The Ear tracklist The Ear movie online The Ear picture editor first The Ear movie watch full The Ear it film in hd The Ear film download link The Ear episode guide download point The Ear The Ear free download The Ear here to purchase movies scenes from The Ear The Ear full movie part The Ear scene the full The Ear movie The Ear free download mediafire downloadable films The Ear buy The Ear tickets order of The Ear The Ear games chat The Ear streaming online The Ear chapters http://dailybooth.com/blacpipers395/21852302 movie The Ear trailer The Ear hd The Ear blu ray set is The Ear good The Ear full movie high quality buy The Ear bluray when does the new The Ear come out watch The Ear movie on computer official The Ear The Ear tracklist The Ear movie online The Ear picture editor first The Ear movie watch full The Ear it film in hd The Ear film download link The Ear episode guide download point The Ear The Ear free download The Ear here to purchase movies scenes from The Ear The Ear full movie part The Ear scene the full The Ear movie The Ear free download mediafire downloadable films The Ear buy The Ear tickets order of The Ear The Ear games chat The Ear streaming online The Ear chapters
+
 
Teenagers from Outer Space torrents movies Teenagers from Outer Space film with good quality is Teenagers from Outer Space a true story when can i buy Teenagers from Outer Space movie website to watch Teenagers from Outer Space film Teenagers from Outer Space fonts Teenagers from Outer Space music downloads Teenagers from Outer Space full movie in hd welcome to Teenagers from Outer Space Teenagers from Outer Space on megavideo Teenagers from Outer Space movie trailers video Teenagers from Outer Space download Teenagers from Outer Space film imdb buy Teenagers from Outer Space film movie showtimes Teenagers from Outer Space read Teenagers from Outer Space comic is Teenagers from Outer Space in theaters Teenagers from Outer Space original download movie Teenagers from Outer Space in hd Teenagers from Outer Space streaming Teenagers from Outer Space preview trailer where is Teenagers from Outer Space playing Teenagers from Outer Space subtitles Teenagers from Outer Space soundtrack rapidshare Teenagers from Outer Space movie torrent Teenagers from Outer Space official trailer quotes from Teenagers from Outer Space movies Teenagers from Outer Space purchase new Teenagers from Outer Space film movie Teenagers from Outer Space showtimes Teenagers from Outer Space discussion Teenagers from Outer Space bluray release rapidshare Teenagers from Outer Space Teenagers from Outer Space online login page actors in Teenagers from Outer Space sound track Teenagers from Outer Space Teenagers from Outer Space game free Teenagers from Outer Space review movie Teenagers from Outer Space online games http://dailybooth.com/blacpipers395/21852306 Teenagers from Outer Space torrents movies Teenagers from Outer Space film with good quality is Teenagers from Outer Space a true story when can i buy Teenagers from Outer Space movie website to watch Teenagers from Outer Space film Teenagers from Outer Space fonts Teenagers from Outer Space music downloads Teenagers from Outer Space full movie in hd welcome to Teenagers from Outer Space Teenagers from Outer Space on megavideo Teenagers from Outer Space movie trailers video Teenagers from Outer Space download Teenagers from Outer Space film imdb buy Teenagers from Outer Space film movie showtimes Teenagers from Outer Space read Teenagers from Outer Space comic is Teenagers from Outer Space in theaters Teenagers from Outer Space original download movie Teenagers from Outer Space in hd Teenagers from Outer Space streaming Teenagers from Outer Space preview trailer where is Teenagers from Outer Space playing Teenagers from Outer Space subtitles Teenagers from Outer Space soundtrack rapidshare Teenagers from Outer Space movie torrent Teenagers from Outer Space official trailer quotes from Teenagers from Outer Space movies Teenagers from Outer Space purchase new Teenagers from Outer Space film movie Teenagers from Outer Space showtimes Teenagers from Outer Space discussion Teenagers from Outer Space bluray release rapidshare Teenagers from Outer Space Teenagers from Outer Space online login page actors in Teenagers from Outer Space sound track Teenagers from Outer Space Teenagers from Outer Space game free Teenagers from Outer Space review movie Teenagers from Outer Space online games
+
И в том и в другом случае на помощь приходят ''замыкания'', ''анонимные функции'' или ''лямбда функции'', как их еще называют. Сущность такой функции в том, что она с одной стороны как бы является переменной, а с другой стороны — функцией, которую можно вызывать. В языке К++, такие функции носят название блоков. Сущность переменной, блоки проявляют в том что их можно создавать как локальные переменные, присваивать друг другу и даже передавать другим функциям в качестве параметра. Приняв такой параметр, функция может обратиться к нему, как к любой другой функции: вызывать с некоторыми параметрами и использовать его возвращаемое значение:
to download The Last Hit Man film The Last Hit Man cards The Last Hit Man full film online The Last Hit Man forums cast for The Last Hit Man The Last Hit Man movie on youtube buy The Last Hit Man film online free online The Last Hit Man The Last Hit Man movie game The Last Hit Man dvd 3d The Last Hit Man end of the world The Last Hit Man news The Last Hit Man video game trailer watch The Last Hit Man trailer download film The Last Hit Man dvdrip soundtrack The Last Hit Man movie The Last Hit Man movie download for free watch The Last Hit Man movie dvd quality purchase movie online The Last Hit Man films The Last Hit Man rules in The Last Hit Man The Last Hit Man movz is The Last Hit Man a true story free The Last Hit Man images The Last Hit Man streaming whistle The Last Hit Man The Last Hit Man online stream The Last Hit Man faq The Last Hit Man movies list in order The Last Hit Man streaming online download The Last Hit Man movie in hd formats The Last Hit Man computer game The Last Hit Man final scene where to watch the whole The Last Hit Man film The Last Hit Man chat websites xbox 360 The Last Hit Man download The Last Hit Man full movie free The Last Hit Man film songs movie times The Last Hit Man film song The Last Hit Man http://gangtemkick.jugem.jp/?eid=4 to download The Last Hit Man film The Last Hit Man cards The Last Hit Man full film online The Last Hit Man forums cast for The Last Hit Man The Last Hit Man movie on youtube buy The Last Hit Man film online free online The Last Hit Man The Last Hit Man movie game The Last Hit Man dvd 3d The Last Hit Man end of the world The Last Hit Man news The Last Hit Man video game trailer watch The Last Hit Man trailer download film The Last Hit Man dvdrip soundtrack The Last Hit Man movie The Last Hit Man movie download for free watch The Last Hit Man movie dvd quality purchase movie online The Last Hit Man films The Last Hit Man rules in The Last Hit Man The Last Hit Man movz is The Last Hit Man a true story free The Last Hit Man images The Last Hit Man streaming whistle The Last Hit Man The Last Hit Man online stream The Last Hit Man faq The Last Hit Man movies list in order The Last Hit Man streaming online download The Last Hit Man movie in hd formats The Last Hit Man computer game The Last Hit Man final scene where to watch the whole The Last Hit Man film The Last Hit Man chat websites xbox 360 The Last Hit Man download The Last Hit Man full movie free The Last Hit Man film songs movie times The Last Hit Man film song The Last Hit Man
+
<source lang="kpp">
http://dailybooth.com/blacpipers395/21852313 Them sountrack original Them Them awards list Them vol soundtrack Them online classes Them sound button Them audio cd Them season where to watch Them full film twitter Them watch Them film high quality Them in 3d trailer for Them Them watch price Them movie games Them trailer song Them two towers quotes Them Them filmography Them mp3 download Them coupon download songs of Them Them film reviews legal Them movie download Them gadgets where to buy Them film Them 3d release watch full length Them online Them reviews ringtone Them Them dvds Them music video Them albums websites to watch Them movie Them sountrack original Them Them awards list Them vol soundtrack Them online classes Them sound button Them audio cd Them season where to watch Them full film twitter Them watch Them film high quality Them in 3d trailer for Them Them watch price Them movie games Them trailer song Them two towers quotes Them Them filmography Them mp3 download Them coupon download songs of Them Them film reviews legal Them movie download Them gadgets where to buy Them film Them 3d release watch full length Them online Them reviews ringtone Them Them dvds Them music video Them albums websites to watch Them movie
+
function Caller(x, y, block b) {
http://dailybooth.com/blacpipers395/21852320 Gabriela game trailer length of Gabriela movie Gabriela poster where is Gabriela playing Gabriela song download Gabriela games download the full Gabriela film online Gabriela online game download watch the entire film of Gabriela online 3d Gabriela creator download Gabriela hd free timeline of Gabriela best quality Gabriela film Gabriela ps2 games Gabriela movie blog online Gabriela watch whole movie of Gabriela movie Gabriela ending download Gabriela movie when does Gabriela open Gabriela free online game windows Gabriela wallpaper soundtrack Gabriela movie Gabriela game guide Gabriela streaming online watch full Gabriela movie in hd ipod Gabriela movie Gabriela sub Gabriela screensaver Gabriela movie trailers Gabriela gifts how to draw Gabriela review on Gabriela Gabriela movie location 3d Gabriela game Gabriela movie awards Gabriela game trailer length of Gabriela movie Gabriela poster where is Gabriela playing Gabriela song download Gabriela games download the full Gabriela film online Gabriela online game download watch the entire film of Gabriela online 3d Gabriela creator download Gabriela hd free timeline of Gabriela best quality Gabriela film Gabriela ps2 games Gabriela movie blog online Gabriela watch whole movie of Gabriela movie Gabriela ending download Gabriela movie when does Gabriela open Gabriela free online game windows Gabriela wallpaper soundtrack Gabriela movie Gabriela game guide Gabriela streaming online watch full Gabriela movie in hd ipod Gabriela movie Gabriela sub Gabriela screensaver Gabriela movie trailers Gabriela gifts how to draw Gabriela review on Gabriela Gabriela movie location 3d Gabriela game Gabriela movie awards
+
    return b(x, y);
 +
}
 +
</source>
 +
 
 +
Приведем простой пример объявления блоков и их передачи в вышеописанную функцию:
 +
<source lang="kpp">
 +
var sum = { |x, y| return x + y; };
 +
var mul = { |x, y| return x * y; };
 +
var s = Caller(2, 3, sum); // s = 2 + 3 = 5
 +
var m = Caller(2, 5, mul); // m = 2 * 5 = 10
 +
</source>
 +
 
 +
Первый блок принимает два параметра и возвращает их сумму; второй блок так же принимает два параметра, но результатом его выполнения будет уже произведение.
 +
 
 +
== Применение блоков ==
 +
 
 +
Наиболее подходящая задача, иллюстрирующая идеологию и способы использования блоков — это сортировка элементов массива. Предположим, что программисту требуется реализовать для класса <tt>array</tt> механизм сортировки элементов. Под сортировкой, в данном случае понимается упорядочение набора элементов на основании некоторого критерия, по которому можно судить об их очередности в списке для каждой пары элементов.
 +
 
 +
Проблема заключается в том, что на этапе написания реализации алгоритма, мы не имеем представления о том, какие же элементы будут храниться в массиве. Как мы отсортируем массив, который может состоять из чего угодно: строк, чисел, произвольных объектов и даже самих массивов? Пришлось бы либо писать обширную реализацию некоторого метода сравнения двух элементов, который бы учитывал все возможные варианты типов элементов, либо реализовывать свою функцию сортировки на каждый из типов данных элементов:
 +
<source lang="kpp">
 +
extend array {
 +
    public function array SortAsNumbers();
 +
    public function array SortAsStrings();
 +
    public function array SortAsArrays();
 +
    public function array SortAsCollections();
 +
}
 +
</source>
 +
 
 +
И тот и другой способ жестко ограничивает функциональность нашего класса только теми типами элементов, которые были изначально предусмотрены. А если программист-пользователь захочет использовать свой тип данных, или еще проще, захочет сортировать элементы не по возрастанию, а по убыванию? Вероятно, мало кто захочет переписывать все эти функции только для того, чтобы изменить порядок сортировки.
 +
 
 +
Давайте взглянем на проблему шире. В сущности, все вышеописанные методы делают ровно одно и то же: некоторым из алгоритмов сортировки, они упорядочивают элементы в массиве. При этом, единственная различающаяся в них часть — это сама операция сравнения двух элементов. Решение напрашивается само собой — необходимо вынести эту часть из функции сортировки и предоставить пользователю самому обеспечить операцию сравнения. Таким образом, мы получим ОДИН метод сортировки, который будет работать для ЛЮБЫХ типов элементов — программист-пользователь сам укажет необходимый критерий сортировки, который уже будет использован внутри метода.
 +
 
 +
Эту задачу можно красиво решить с помощью блоков:
 +
<source lang="kpp">
 +
extend array {
 +
    public const function array sort(block cmp) {
 +
        return this if size < 2;
 +
        var array left, array right;
 +
        for (var i = 1; i < size; ++i)
 +
            cmp(this[i], this[0]) ? left.push(this[i]) : right.push(this[i]);
 +
        return left.sort(cmp) + [ this[0] ] + right.sort(cmp);
 +
    }
 +
}
 +
</source>
 +
 
 +
В качестве параметра, метод <tt>sort()</tt> принимает один аргумент — блок, который должен производить сравнение двух элементов и возвращать истину, если элементы расположены в правильном порядке и ложь, если порядок неверный, то есть необхдимо их переставить.
 +
 
 +
'''Примечание:''' Приведенный здесь код является реализацией алгоритма [http://ru.wikipedia.org/wiki/Быстрая_сортировка быстрой сортировки], однако он является не очень практичным, поскольку на каждом из этапов он оперирует с копиями соответствующих частей массива; в книге же был использован из соображений краткости кода.
 +
 
 +
Теперь, любой массив в программе, использующей текущий модуль, может быть отсортирован на основании некоторого критерия. Результатом выполнения будет другой, уже отсортированный массив:
 +
 
 +
<source lang="kpp">
 +
var array sorted, ary = [2, 7, 3, 0, 1, 5, 8, 9, 4, 6];
 +
sorted = ary.sort() { |x, y| x < y; }; // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
 +
sorted = ary.sort() { |x, y| x > y; }; // [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
 +
 
 +
ary = ['q', 'e', 'b', 'z', 'a', 'x', 't'];
 +
sorted = ary.sort() { |x, y| x < y; }; // ['a', 'b', 'e', 'q', 't', 'x', 'z']
 +
sorted = ary.sort() { |x, y| x > y; }; // ['z', 'x', 't', 'q', 'e', 'b', 'a']
 +
</source>
 +
 
 +
Мы объявляем две переменных-массива ''ary'' и ''sorted''. Переменная ''ary'' инициализируется массивом произвольных чисел, либо строк во втором случае. Затем выполняются вызовы метода <tt>sort()</tt>, результат выполнения которых сохраняется в переменной ''sorted''.  
 +
 
 +
'''Примечание:''' Для сокращения записи, в вышеописанном коде были применены т. н. ''встроенные блоки'' (inline). К++ поддерживает специальный синтаксис для передачи встроенных блоков в функции. Подробнее об этом будет написано чуть ниже.
 +
 
 +
== Отличие от функций ==
 +
 
 +
В целом, блоки очень похожи на обычные функции, однако существует несколько отличий, которые следует иметь в виду. Первое, наиболее очевидное отличие заключается в способе описания формальных параметров, которые, в отличие от функций, записываются в самом начале тела блока, между двумя вертикальными чертами. Друг от друга параметры отделяются запятой.
 +
 
 +
Главное отличие блоков заключается в том, что они в основном ориентированы на динамический код. Скажем, возвращаемое значение всегда является [[Переменные#Нетипированные (динамические) переменные|динамической переменной]]. В отдельных случаях допускается типизация аргументов блока, однако она происходит внутри самого блока и не влияет на фактически передаваемые параметры (см. ниже). Таким образом, с точки зрения вызывающего кода, блоки всегда представляют собой динамический код.
 +
 
 +
Блоки не могут быть экспортированы из текущего модуля и должны применяться только в нем самом. Разумеется, экспортировать функции, принимающие блоки в качестве параметров можно.
 +
 
 +
== Типизация параметров ==
 +
 
 +
В некоторых случаях, для повышения эффективности кода блока можно типировать формальные параметры, с тем чтобы впоследствии компилятор, на основании этой информации, мог бы генерировать статический код. Типирование аргументов осуществляется точно так же, как и в обычных функциях: непосредственно перед идентификатором аргумента, указывается его тип.
 +
<source lang="kpp">
 +
var myblock = { | int x, int y | /* код блока */ };
 +
</source>
 +
Теперь, в теле блока, переменные ''x'' и ''y'' будут считаться статическими.  
 +
 
 +
'''Примечание 1:''' Поскольку на момент компиляции, у компилятора нет возможности проверить правильность типов передаваемых в блок параметров, ответственность за это ложится на самого программиста. Если в блок будет передан объект неприводимого типа, то это приведет к ошибке времени исполнения ([[Идеология языка#Понятие исключения|исключению]]).
 +
 
 +
'''Примечание 2:''' Указание типов в параметрах может быть удобно, поскольку компилятор, располагая информацией о типе параметров, может выполнять некоторую работу автоматически. Например, приводить переменные к нужному типу при вызове других функций. Допустим, мы хотим описать некоторый блок, который по логике работы принимает число (переменную типа <tt>int</tt>), но внутри себя вызывает другие функции, скажем <tt>puts()</tt>:
 +
 
 +
<source lang="kpp" line="1">
 +
var myblock = { |x|
 +
    /* код блока */  
 +
    puts(x as string);
 +
};
 +
</source>
 +
 
 +
В данном случае, в строке 3, при вызове <tt>puts()</tt>, нам пришлось привести тип переменной ''x'' к строке явным образом. Если бы этого не было сделано, то возникла бы ошибка времени исполнения, поскольку функция <tt>puts()</tt> ожидает строку. При небольших размерах кода это не составляет проблем, однако приводить тип переменной пришлось бы в каждом вызове. Для решения этой проблемы как раз рекомендуется применять типирование аргументов:
 +
 
 +
<source lang="kpp" line="1">
 +
var myblock = { | int x |
 +
    /* код блока */  
 +
    puts(x); //теперь, приведение происходит автоматически
 +
};
 +
</source>
 +
 
 +
== Встроенные блоки ==
 +
 
 +
Чаще всего, блоки применяются для записи небольших кусочков кода, которые, как в примерах выше, передаются в функции, для уточнения некоторых моментов. Для того чтобы облегчить работу программиста и сделать код более читаемым, был введен специальный синтаксис для передачи блоков в функции с одновременным их объявлением "на месте"; при этом, блоки записываются в сокращенной форме сразу за кодом вызова функции, после блока фактических параметров.
 +
 
 +
Покажем использование встроенных блоков на примере нахождения суммы чисел от 1 до 10, а так же получения списка четных чисел в этом же интервале.
 +
<source lang="kpp">
 +
var s = 0;
 +
var numbers = [];
 +
(1..10).each() { |x| s += x; numbers.push(x); };
 +
var evens = numbers.collect() { |x| x % 2 == 0 ? x : null; }.compact();
 +
</source>
 +
 
 +
Несмотря на свою простоту и надуманность, данный пример показывает две особенности встроенных блоков, по сравнению с обычными блоками, объявляемыми как переменные. Первая особенность заключается в том, что встроенные блоки имеют доступ к локальным переменным в контексте вызова (то есть, замыкаются на него — отсюда и название "замыкания"). Например, данный блок использует внешние по отношению к нему переменные: ''s'' для накопления суммы, а ''numbers'' для добавления текущего числа в массив.
 +
 
 +
Вторая особенность реализуется в коде второго встроенного блока. Она заключается в том, что встроенные блоки могут возвращать значения без явного указания оператора <tt>'''return'''</tt>. Однако, это вожможно только для простых выражений, без применения операторов ветвления. Для получения массива целых чисел, используются два метода, объявленные в стандартной библиотеке языка K++: методы <tt>collect()</tt> и <tt>compact()</tt>.
 +
 
 +
Метод <tt>collect()</tt> принимает в качестве аргумента блок. Далее, он проходит вдоль всего массива, вызывая блок с параметром текущего элемента. Результат выполнения блока помещается в другой массив, который возвращается вызывающему коду. Таким образом, этот метод может применяться для обработки элементов некоторого массива с получением другого массива из обработанных элементов. Метод <tt>compact()</tt> используется для "уплотнения" массива, путем удаления из него пустых элементов, равных <tt>'''null'''</tt>.  
 +
 
 +
В вышеприведенном коде, мы используем оба этих метода для того, чтобы сначала выбрать из исходного массива все четные элементы (вместо нечетных вставляется <tt>'''null'''</tt>), а затем уплотнить полученный массив.
 +
 
 +
Реализованы эти методы могут быть примерно так:
 +
<source lang="kpp">
 +
extend array {
 +
    public const function array collect(block b) {
 +
        var array result;
 +
        this.each() { |x| result.push(b(x)); };
 +
        return result;
 +
    }
 +
 
 +
    public const function array compact() {
 +
        var array result;
 +
        this.each() { |x| result.push(b(x)) if x; };
 +
        return result;
 +
    }
 +
}
 +
</source>
 +
 
 +
'''Примечание 1:''' при работе со встроенными блоками внутри обрабатывающих функций, следует быть очень осторожным. Поскольку, встроенные блоки оперируют с перменными контекста своего объявления, то они должны существовать не дольше чем существует сам блок, в котором они были объявлены и в котором был произведен вызов функции-обработчика.
 +
 
 +
Сама функция, должна работать с ними "как есть"; ни в коем случае нельзя их сохранять во внешних переменных (где они могут просуществовать дольше положенного времени). Например, такой код '''является недопустимым''':
 +
<source lang="kpp">
 +
var block_array = [];
 +
function AddBlock(block b) { block_array.push(b); }
 +
function f() {
 +
    const c = 5;
 +
    AddBlock() { |x| x * c; }; // так делать нельзя!
 +
}
 +
</source>
 +
В коде блока мы видим использование внешнего объекта — константы ''c''. Проблема заключается в том, что встроенные блоки не порождают собственного контекста и заимствуют набор локальных переменных из контекста вызова. Соответственно, если блок был где то сохранен, то может случиться, что контект его локальных переменных был уже удален.
 +
 
 +
В то же время, такой код вполне правомерен:
 +
<source lang="kpp">
 +
function f() {
 +
    var b = { |x| return x + 1; }; // а так можно
 +
    AddBlock(b);
 +
 
 +
    //так тоже можно, но не рекомендуется:
 +
    AddBlock({|x| return x * 5;});
 +
}
 +
</source>
 +
 
 +
'''Примечание 2:''' хотя использование связки <tt>collect(){...}.compact()</tt> не возбраняется, следует иметь в виду, что происходит двойное копирование массивов, что в конечном счете сказывается на производительности. Для задачи выбора (а не обработки) элементов из массива, более приемлемым вариантом является использование метода <tt>select()</tt>, который отбирает из исходного массива все элементы, удовлетворяющие условию, записанному в блоке:
 +
 
 +
<source lang="kpp">
 +
var ary = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
 +
var selected = ary.select() { |x| x > 6; }; // [7, 8, 9, 10]
 +
</source>
 +
 
 +
При использовании метода <tt>select()</tt> промежуточного копирования не происходит, так что операция будет выполняться более эффективно.
 +
 
 +
----
 +
 
 +
 
 +
Механизм встроенных блоков — это очень мощный инструмент, который при грамотном использовании позволяет добиться потрясающих результатов при написании программ. Программы получаются очень лаконичными, легко читаемыми и иногда даже более эффективными, чем при традиционном подходе.
 +
 
 +
К примеру, вот пример кода, который обращается на FTP сервер и выбирает из некоторой директории все файлы, имеющие расширение '.conf':
 +
<source lang="kpp">
 +
var configs = Directory.open('ftp://example.com/media/etc')
 +
    .browse().select() { |file| file.name =~ `\.conf$`; };
 +
</source>
 +
 
 +
На традиционных языках, такая операция могла бы занять с десяток строк кода, тогда как здесь мы обходимся всего одной (строка разбита две части для того, чтобы уместить в ширину страницы).
 +
 
 +
Учитывая принципы полудинамической типизации, некоторые конструкции могут быть более лаконичными даже по сравнению с подобными языками. Например, следующий код на C# 2.0 позволяет увеличить все элементы массива на 2:
 +
<source lang="csharp">
 +
int[] ary = { 1, 2, 3 };
 +
int x = 2;
 +
Array.ConvertAll<int, int>(ary, delegate(int elem) { return elem * x; }); // { 2, 4, 6 }
 +
</source>
 +
 
 +
На K++ эта же конструкция будет выглядеть так:
 +
<source lang="kpp">
 +
var ary = [1, 2, 3];
 +
var x = 2;
 +
ary.convert() { |e| e * x; }; // [2, 4, 6]
 +
</source>
 +
 
 +
Конечно, можно привести массу доводов в защиту того или иного языка, укзазать преимущества однго и недостатки другого, чем с упоением и занимаются многочисленные разжигатели религиозных войн в среде IT. Мы не ставим себе целью доказать преимущества K++, скорее показать преимущества всех языков, использующих альтернативный подход к программированию в целом. К чести того же C# можно сказать, что в третей версии были введены замыкания, по краткости не уступающие K++. В целом, у каждого языка есть свои преимущества и недостатки и в общем случае сравнивать их нельзя. Можно, разве что, судить о степени удобства языка, в сочетании с его производительностью и о том, насколько эффективно он позволяет решать задачи, на которые был рассчитан и исходя из которых проектировался.

Текущая версия на 13:40, 13 июля 2013

Содержание


Основной идеей при написании как процедурных, так и объектно-ориентированных программ является локализация (заключение) функционала в некоторой области: в функции, либо в методе. Таким образом получается, что программа состоит из множества функционально независимых частей, каждая из которых решает конкретную, достаточно узкую задачу. Такой подход позволяет скрыть детали реализации алгоритмов внутри этих частей, а "наружу" предоставить только интерфейс — совокупность способов взаимодействия данного функционального элемента с другими. В случае функции, под интерфейсом понимается совокупность ее параметров и возвращаемого значения; в случае классов — наборы методов и свойств.

Случается, что в работе некоторого алгоритма возникают четко определенные функциональные подсистемы, которые, однако, слишком зависимы от самого алгоритма, либо слишком просты для того, чтобы выделять их в отдельную функцию. В случае с C++ это все же приходится делать, даже если эта "минифункция" применяется всего в одном методе, но достаточное количество раз, чтобы программист не захотел копировать эти строки.

В других случаях, может возникнуть желание вынести некоторый функционал за пределы текущей функции, или даже предоставить программисту-пользователю возможность самому определить его.

И в том и в другом случае на помощь приходят замыкания, анонимные функции или лямбда функции, как их еще называют. Сущность такой функции в том, что она с одной стороны как бы является переменной, а с другой стороны — функцией, которую можно вызывать. В языке К++, такие функции носят название блоков. Сущность переменной, блоки проявляют в том что их можно создавать как локальные переменные, присваивать друг другу и даже передавать другим функциям в качестве параметра. Приняв такой параметр, функция может обратиться к нему, как к любой другой функции: вызывать с некоторыми параметрами и использовать его возвращаемое значение: <source lang="kpp"> function Caller(x, y, block b) {

   return b(x, y);

} </source>

Приведем простой пример объявления блоков и их передачи в вышеописанную функцию: <source lang="kpp"> var sum = { |x, y| return x + y; }; var mul = { |x, y| return x * y; }; var s = Caller(2, 3, sum); // s = 2 + 3 = 5 var m = Caller(2, 5, mul); // m = 2 * 5 = 10 </source>

Первый блок принимает два параметра и возвращает их сумму; второй блок так же принимает два параметра, но результатом его выполнения будет уже произведение.

[править] Применение блоков

Наиболее подходящая задача, иллюстрирующая идеологию и способы использования блоков — это сортировка элементов массива. Предположим, что программисту требуется реализовать для класса array механизм сортировки элементов. Под сортировкой, в данном случае понимается упорядочение набора элементов на основании некоторого критерия, по которому можно судить об их очередности в списке для каждой пары элементов.

Проблема заключается в том, что на этапе написания реализации алгоритма, мы не имеем представления о том, какие же элементы будут храниться в массиве. Как мы отсортируем массив, который может состоять из чего угодно: строк, чисел, произвольных объектов и даже самих массивов? Пришлось бы либо писать обширную реализацию некоторого метода сравнения двух элементов, который бы учитывал все возможные варианты типов элементов, либо реализовывать свою функцию сортировки на каждый из типов данных элементов: <source lang="kpp"> extend array {

   public function array SortAsNumbers();
   public function array SortAsStrings();
   public function array SortAsArrays();
   public function array SortAsCollections();

} </source>

И тот и другой способ жестко ограничивает функциональность нашего класса только теми типами элементов, которые были изначально предусмотрены. А если программист-пользователь захочет использовать свой тип данных, или еще проще, захочет сортировать элементы не по возрастанию, а по убыванию? Вероятно, мало кто захочет переписывать все эти функции только для того, чтобы изменить порядок сортировки.

Давайте взглянем на проблему шире. В сущности, все вышеописанные методы делают ровно одно и то же: некоторым из алгоритмов сортировки, они упорядочивают элементы в массиве. При этом, единственная различающаяся в них часть — это сама операция сравнения двух элементов. Решение напрашивается само собой — необходимо вынести эту часть из функции сортировки и предоставить пользователю самому обеспечить операцию сравнения. Таким образом, мы получим ОДИН метод сортировки, который будет работать для ЛЮБЫХ типов элементов — программист-пользователь сам укажет необходимый критерий сортировки, который уже будет использован внутри метода.

Эту задачу можно красиво решить с помощью блоков: <source lang="kpp"> extend array {

   public const function array sort(block cmp) {
       return this if size < 2;
       var array left, array right;
       for (var i = 1; i < size; ++i)
           cmp(this[i], this[0]) ? left.push(this[i]) : right.push(this[i]);
       return left.sort(cmp) + [ this[0] ] + right.sort(cmp);
   }

} </source>

В качестве параметра, метод sort() принимает один аргумент — блок, который должен производить сравнение двух элементов и возвращать истину, если элементы расположены в правильном порядке и ложь, если порядок неверный, то есть необхдимо их переставить.

Примечание: Приведенный здесь код является реализацией алгоритма быстрой сортировки, однако он является не очень практичным, поскольку на каждом из этапов он оперирует с копиями соответствующих частей массива; в книге же был использован из соображений краткости кода.

Теперь, любой массив в программе, использующей текущий модуль, может быть отсортирован на основании некоторого критерия. Результатом выполнения будет другой, уже отсортированный массив:

<source lang="kpp"> var array sorted, ary = [2, 7, 3, 0, 1, 5, 8, 9, 4, 6]; sorted = ary.sort() { |x, y| x < y; }; // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] sorted = ary.sort() { |x, y| x > y; }; // [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

ary = ['q', 'e', 'b', 'z', 'a', 'x', 't']; sorted = ary.sort() { |x, y| x < y; }; // ['a', 'b', 'e', 'q', 't', 'x', 'z'] sorted = ary.sort() { |x, y| x > y; }; // ['z', 'x', 't', 'q', 'e', 'b', 'a'] </source>

Мы объявляем две переменных-массива ary и sorted. Переменная ary инициализируется массивом произвольных чисел, либо строк во втором случае. Затем выполняются вызовы метода sort(), результат выполнения которых сохраняется в переменной sorted.

Примечание: Для сокращения записи, в вышеописанном коде были применены т. н. встроенные блоки (inline). К++ поддерживает специальный синтаксис для передачи встроенных блоков в функции. Подробнее об этом будет написано чуть ниже.

[править] Отличие от функций

В целом, блоки очень похожи на обычные функции, однако существует несколько отличий, которые следует иметь в виду. Первое, наиболее очевидное отличие заключается в способе описания формальных параметров, которые, в отличие от функций, записываются в самом начале тела блока, между двумя вертикальными чертами. Друг от друга параметры отделяются запятой.

Главное отличие блоков заключается в том, что они в основном ориентированы на динамический код. Скажем, возвращаемое значение всегда является динамической переменной. В отдельных случаях допускается типизация аргументов блока, однако она происходит внутри самого блока и не влияет на фактически передаваемые параметры (см. ниже). Таким образом, с точки зрения вызывающего кода, блоки всегда представляют собой динамический код.

Блоки не могут быть экспортированы из текущего модуля и должны применяться только в нем самом. Разумеется, экспортировать функции, принимающие блоки в качестве параметров можно.

[править] Типизация параметров

В некоторых случаях, для повышения эффективности кода блока можно типировать формальные параметры, с тем чтобы впоследствии компилятор, на основании этой информации, мог бы генерировать статический код. Типирование аргументов осуществляется точно так же, как и в обычных функциях: непосредственно перед идентификатором аргумента, указывается его тип. <source lang="kpp"> var myblock = { | int x, int y | /* код блока */ }; </source> Теперь, в теле блока, переменные x и y будут считаться статическими.

Примечание 1: Поскольку на момент компиляции, у компилятора нет возможности проверить правильность типов передаваемых в блок параметров, ответственность за это ложится на самого программиста. Если в блок будет передан объект неприводимого типа, то это приведет к ошибке времени исполнения (исключению).

Примечание 2: Указание типов в параметрах может быть удобно, поскольку компилятор, располагая информацией о типе параметров, может выполнять некоторую работу автоматически. Например, приводить переменные к нужному типу при вызове других функций. Допустим, мы хотим описать некоторый блок, который по логике работы принимает число (переменную типа int), но внутри себя вызывает другие функции, скажем puts():

<source lang="kpp" line="1"> var myblock = { |x|

   /* код блока */ 
   puts(x as string); 

}; </source>

В данном случае, в строке 3, при вызове puts(), нам пришлось привести тип переменной x к строке явным образом. Если бы этого не было сделано, то возникла бы ошибка времени исполнения, поскольку функция puts() ожидает строку. При небольших размерах кода это не составляет проблем, однако приводить тип переменной пришлось бы в каждом вызове. Для решения этой проблемы как раз рекомендуется применять типирование аргументов:

<source lang="kpp" line="1"> var myblock = { | int x |

   /* код блока */ 
   puts(x); //теперь, приведение происходит автоматически

}; </source>

[править] Встроенные блоки

Чаще всего, блоки применяются для записи небольших кусочков кода, которые, как в примерах выше, передаются в функции, для уточнения некоторых моментов. Для того чтобы облегчить работу программиста и сделать код более читаемым, был введен специальный синтаксис для передачи блоков в функции с одновременным их объявлением "на месте"; при этом, блоки записываются в сокращенной форме сразу за кодом вызова функции, после блока фактических параметров.

Покажем использование встроенных блоков на примере нахождения суммы чисел от 1 до 10, а так же получения списка четных чисел в этом же интервале. <source lang="kpp"> var s = 0; var numbers = []; (1..10).each() { |x| s += x; numbers.push(x); }; var evens = numbers.collect() { |x| x % 2 == 0 ? x : null; }.compact(); </source>

Несмотря на свою простоту и надуманность, данный пример показывает две особенности встроенных блоков, по сравнению с обычными блоками, объявляемыми как переменные. Первая особенность заключается в том, что встроенные блоки имеют доступ к локальным переменным в контексте вызова (то есть, замыкаются на него — отсюда и название "замыкания"). Например, данный блок использует внешние по отношению к нему переменные: s для накопления суммы, а numbers для добавления текущего числа в массив.

Вторая особенность реализуется в коде второго встроенного блока. Она заключается в том, что встроенные блоки могут возвращать значения без явного указания оператора return. Однако, это вожможно только для простых выражений, без применения операторов ветвления. Для получения массива целых чисел, используются два метода, объявленные в стандартной библиотеке языка K++: методы collect() и compact().

Метод collect() принимает в качестве аргумента блок. Далее, он проходит вдоль всего массива, вызывая блок с параметром текущего элемента. Результат выполнения блока помещается в другой массив, который возвращается вызывающему коду. Таким образом, этот метод может применяться для обработки элементов некоторого массива с получением другого массива из обработанных элементов. Метод compact() используется для "уплотнения" массива, путем удаления из него пустых элементов, равных null.

В вышеприведенном коде, мы используем оба этих метода для того, чтобы сначала выбрать из исходного массива все четные элементы (вместо нечетных вставляется null), а затем уплотнить полученный массив.

Реализованы эти методы могут быть примерно так: <source lang="kpp"> extend array {

   public const function array collect(block b) {
       var array result;
       this.each() { |x| result.push(b(x)); };
       return result;
   }
   public const function array compact() {
       var array result;
       this.each() { |x| result.push(b(x)) if x; };
       return result;
   }

} </source>

Примечание 1: при работе со встроенными блоками внутри обрабатывающих функций, следует быть очень осторожным. Поскольку, встроенные блоки оперируют с перменными контекста своего объявления, то они должны существовать не дольше чем существует сам блок, в котором они были объявлены и в котором был произведен вызов функции-обработчика.

Сама функция, должна работать с ними "как есть"; ни в коем случае нельзя их сохранять во внешних переменных (где они могут просуществовать дольше положенного времени). Например, такой код является недопустимым: <source lang="kpp"> var block_array = []; function AddBlock(block b) { block_array.push(b); } function f() {

   const c = 5;
   AddBlock() { |x| x * c; }; // так делать нельзя!

} </source> В коде блока мы видим использование внешнего объекта — константы c. Проблема заключается в том, что встроенные блоки не порождают собственного контекста и заимствуют набор локальных переменных из контекста вызова. Соответственно, если блок был где то сохранен, то может случиться, что контект его локальных переменных был уже удален.

В то же время, такой код вполне правомерен: <source lang="kpp"> function f() {

   var b = { |x| return x + 1; }; // а так можно
   AddBlock(b); 
   //так тоже можно, но не рекомендуется:
   AddBlock({|x| return x * 5;}); 

} </source>

Примечание 2: хотя использование связки collect(){...}.compact() не возбраняется, следует иметь в виду, что происходит двойное копирование массивов, что в конечном счете сказывается на производительности. Для задачи выбора (а не обработки) элементов из массива, более приемлемым вариантом является использование метода select(), который отбирает из исходного массива все элементы, удовлетворяющие условию, записанному в блоке:

<source lang="kpp"> var ary = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; var selected = ary.select() { |x| x > 6; }; // [7, 8, 9, 10] </source>

При использовании метода select() промежуточного копирования не происходит, так что операция будет выполняться более эффективно.



Механизм встроенных блоков — это очень мощный инструмент, который при грамотном использовании позволяет добиться потрясающих результатов при написании программ. Программы получаются очень лаконичными, легко читаемыми и иногда даже более эффективными, чем при традиционном подходе.

К примеру, вот пример кода, который обращается на FTP сервер и выбирает из некоторой директории все файлы, имеющие расширение '.conf': <source lang="kpp"> var configs = Directory.open('ftp://example.com/media/etc')

   .browse().select() { |file| file.name =~ `\.conf$`; };

</source>

На традиционных языках, такая операция могла бы занять с десяток строк кода, тогда как здесь мы обходимся всего одной (строка разбита две части для того, чтобы уместить в ширину страницы).

Учитывая принципы полудинамической типизации, некоторые конструкции могут быть более лаконичными даже по сравнению с подобными языками. Например, следующий код на C# 2.0 позволяет увеличить все элементы массива на 2: <source lang="csharp"> int[] ary = { 1, 2, 3 }; int x = 2; Array.ConvertAll<int, int>(ary, delegate(int elem) { return elem * x; }); // { 2, 4, 6 } </source>

На K++ эта же конструкция будет выглядеть так: <source lang="kpp"> var ary = [1, 2, 3]; var x = 2; ary.convert() { |e| e * x; }; // [2, 4, 6] </source>

Конечно, можно привести массу доводов в защиту того или иного языка, укзазать преимущества однго и недостатки другого, чем с упоением и занимаются многочисленные разжигатели религиозных войн в среде IT. Мы не ставим себе целью доказать преимущества K++, скорее показать преимущества всех языков, использующих альтернативный подход к программированию в целом. К чести того же C# можно сказать, что в третей версии были введены замыкания, по краткости не уступающие K++. В целом, у каждого языка есть свои преимущества и недостатки и в общем случае сравнивать их нельзя. Можно, разве что, судить о степени удобства языка, в сочетании с его производительностью и о том, насколько эффективно он позволяет решать задачи, на которые был рассчитан и исходя из которых проектировался.

Персональные инструменты
Пространства имён

Варианты
Действия
Навигация
информация
документация
Инструменты