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

Материал из Deeptown Manual
Перейти к: навигация, поиск
(http://dailybooth.com/rdentersjes/21852616 There s Nothing Out There download ipod cheapest There s Nothing Out There dvd gif There s Nothing Out There There s Nothing Out There movie for cheap There)
 
(не показаны 22 405 промежуточных версий 4 участников)
Строка 1: Строка 1:
http://dailybooth.com/rdentersjes/21852616 There s Nothing Out There download ipod cheapest There s Nothing Out There dvd gif There s Nothing Out There There s Nothing Out There movie for cheap There s Nothing Out There torrents download mp3 download There s Nothing Out There There s Nothing Out There rip the full There s Nothing Out There film online There s Nothing Out There cheats for ps2 download the film There s Nothing Out There There s Nothing Out There film hd download There s Nothing Out There game There s Nothing Out There online soundtrack download buy There s Nothing Out There movie high quality There s Nothing Out There voice There s Nothing Out There game 3d There s Nothing Out There vol music when does There s Nothing Out There come out leaked There s Nothing Out There trailer There s Nothing Out There original where can i download There s Nothing Out There online how long is There s Nothing Out There There s Nothing Out There fileserve games of There s Nothing Out There There s Nothing Out There download megaupload There s Nothing Out There writer There s Nothing Out There movie characters dvd There s Nothing Out There online There s Nothing Out There movie download hd There s Nothing Out There game download used There s Nothing Out There virtual There s Nothing Out There world There s Nothing Out There hq There s Nothing Out There movies list There s Nothing Out There real person watch film of There s Nothing Out There new There s Nothing Out There games There s Nothing Out There film wikipedia make your own There s Nothing Out There list There s Nothing Out There movies length of There s Nothing Out There There s Nothing Out There dvd9 There s Nothing Out There in 3d were can i download There s Nothing Out There movie ringtones There s Nothing Out There download There s Nothing Out There online for free There s Nothing Out There tickets There s Nothing Out There download ipod cheapest There s Nothing Out There dvd gif There s Nothing Out There There s Nothing Out There movie for cheap There s Nothing Out There torrents download mp3 download There s Nothing Out There There s Nothing Out There rip the full There s Nothing Out There film online There s Nothing Out There cheats for ps2 download the film There s Nothing Out There There s Nothing Out There film hd download There s Nothing Out There game There s Nothing Out There online soundtrack download buy There s Nothing Out There movie high quality There s Nothing Out There voice There s Nothing Out There game 3d There s Nothing Out There vol music when does There s Nothing Out There come out leaked There s Nothing Out There trailer There s Nothing Out There original where can i download There s Nothing Out There online how long is There s Nothing Out There There s Nothing Out There fileserve games of There s Nothing Out There There s Nothing Out There download megaupload There s Nothing Out There writer There s Nothing Out There movie characters dvd There s Nothing Out There online There s Nothing Out There movie download hd There s Nothing Out There game download used There s Nothing Out There virtual There s Nothing Out There world There s Nothing Out There hq There s Nothing Out There movies list There s Nothing Out There real person watch film of There s Nothing Out There new There s Nothing Out There games There s Nothing Out There film wikipedia make your own There s Nothing Out There list There s Nothing Out There movies length of There s Nothing Out There There s Nothing Out There dvd9 There s Nothing Out There in 3d were can i download There s Nothing Out There movie ringtones There s Nothing Out There download There s Nothing Out There online for free There s Nothing Out There tickets
+
__TOC__
http://brontisbthimb.jugem.jp/?eid=6 all For Pete s Sake episodes For Pete s Sake free online movie rules from For Pete s Sake For Pete s Sake sign For Pete s Sake real video For Pete s Sake 3d showtimes rapidshare For Pete s Sake For Pete s Sake movie plot For Pete s Sake film locations fun For Pete s Sake websites For Pete s Sake trailer youtube For Pete s Sake movie for download For Pete s Sake up For Pete s Sake icon is For Pete s Sake a true story For Pete s Sake audio cd games of For Pete s Sake For Pete s Sake soundtrack lyrics watch For Pete s Sake film in full For Pete s Sake order For Pete s Sake movie times For Pete s Sake ps2 game For Pete s Sake game wiki For Pete s Sake and film For Pete s Sake wav fast For Pete s Sake movie images online For Pete s Sake games For Pete s Sake dvd release date movies like For Pete s Sake For Pete s Sake magazine For Pete s Sake reversed For Pete s Sake 3d blueray make your For Pete s Sake movie net For Pete s Sake online whole For Pete s Sake film For Pete s Sake audiobooks For Pete s Sake sound effect For Pete s Sake times all For Pete s Sake episodes For Pete s Sake free online movie rules from For Pete s Sake For Pete s Sake sign For Pete s Sake real video For Pete s Sake 3d showtimes rapidshare For Pete s Sake For Pete s Sake movie plot For Pete s Sake film locations fun For Pete s Sake websites For Pete s Sake trailer youtube For Pete s Sake movie for download For Pete s Sake up For Pete s Sake icon is For Pete s Sake a true story For Pete s Sake audio cd games of For Pete s Sake For Pete s Sake soundtrack lyrics watch For Pete s Sake film in full For Pete s Sake order For Pete s Sake movie times For Pete s Sake ps2 game For Pete s Sake game wiki For Pete s Sake and film For Pete s Sake wav fast For Pete s Sake movie images online For Pete s Sake games For Pete s Sake dvd release date movies like For Pete s Sake For Pete s Sake magazine For Pete s Sake reversed For Pete s Sake 3d blueray make your For Pete s Sake movie net For Pete s Sake online whole For Pete s Sake film For Pete s Sake audiobooks For Pete s Sake sound effect For Pete s Sake times
+
 
http://tiworta.blogg.se/2012/january/buy-love-for-sale-2006-movie-high-quality.html Love for Sale pc game free download watch the new Love for Sale movie Love for Sale good film for sale xbox Love for Sale Love for Sale showing locations remote control Love for Sale i want to watch the full film of Love for Sale online Love for Sale movie reviews Love for Sale full movie part Love for Sale 1080p hotfile the cast of Love for Sale how to watch Love for Sale online Love for Sale movie desktop ratings for Love for Sale Love for Sale video clips is Love for Sale on dvd yet Love for Sale fileserve Love for Sale film for cheap filmations Love for Sale full movie online Love for Sale Love for Sale fansite Love for Sale world Love for Sale soudtrack watch Love for Sale full film high quality Love for Sale cheat codes Love for Sale dvd sales online to watch Love for Sale movie download Love for Sale hd free Love for Sale fancy dress Love for Sale full movie download movie trailer Love for Sale Love for Sale online trial Love for Sale download rapidshare Love for Sale creator online watch Love for Sale free online reviews Love for Sale film Love for Sale clipart how to download Love for Sale movie gif Love for Sale download the whole film of Love for Sale free Love for Sale online Love for Sale fans play Love for Sale online without downloading Love for Sale movie news download Love for Sale film now movie reviews Love for Sale Love for Sale boxed set dvd Love for Sale pc game free download watch the new Love for Sale movie Love for Sale good film for sale xbox Love for Sale Love for Sale showing locations remote control Love for Sale i want to watch the full film of Love for Sale online Love for Sale movie reviews Love for Sale full movie part Love for Sale 1080p hotfile the cast of Love for Sale how to watch Love for Sale online Love for Sale movie desktop ratings for Love for Sale Love for Sale video clips is Love for Sale on dvd yet Love for Sale fileserve Love for Sale film for cheap filmations Love for Sale full movie online Love for Sale Love for Sale fansite Love for Sale world Love for Sale soudtrack watch Love for Sale full film high quality Love for Sale cheat codes Love for Sale dvd sales online to watch Love for Sale movie download Love for Sale hd free Love for Sale fancy dress Love for Sale full movie download movie trailer Love for Sale Love for Sale online trial Love for Sale download rapidshare Love for Sale creator online watch Love for Sale free online reviews Love for Sale film Love for Sale clipart how to download Love for Sale movie gif Love for Sale download the whole film of Love for Sale free Love for Sale online Love for Sale fans play Love for Sale online without downloading Love for Sale movie news download Love for Sale film now movie reviews Love for Sale Love for Sale boxed set dvd
+
Основной идеей при написании как процедурных, так и объектно-ориентированных программ является локализация (заключение) функционала в некоторой области: в функции, либо в методе. Таким образом получается, что программа состоит из множества функционально независимых частей, каждая из которых решает конкретную, достаточно узкую задачу. Такой подход позволяет скрыть детали реализации алгоритмов внутри этих частей, а "наружу" предоставить только интерфейс — совокупность способов взаимодействия данного функционального элемента с другими. В случае функции, под интерфейсом понимается совокупность ее параметров и возвращаемого значения; в случае классов — наборы методов и свойств.
A Killer Within director welcome to A Killer Within A Killer Within movie yahoo posters A Killer Within real A Killer Within suit A Killer Within dvd blu ray A Killer Within games free online A Killer Within movie location A Killer Within movie photos watch A Killer Within movie in hd A Killer Within encyclopedia 3d bluray A Killer Within A Killer Within search watch whole movie of A Killer Within A Killer Within playstation A Killer Within trailer download hd A Killer Within movie on dvd A Killer Within stream A Killer Within A Killer Within song A Killer Within film great quality A Killer Within order of cheap A Killer Within tickets watch A Killer Within for free A Killer Within on megavideo all A Killer Within spells A Killer Within movie in hd A Killer Within blueray A Killer Within all star free A Killer Within websites new A Killer Within A Killer Within new pictures of A Killer Within characters A Killer Within film out download entire A Killer Within movie official A Killer Within trailer buy A Killer Within dvd A Killer Within mp3 songs A Killer Within movie length review of A Killer Within uncut A Killer Within A Killer Within opening credits A Killer Within in order 3 d A Killer Within A Killer Within movie show times actors in A Killer Within first edition A Killer Within buy A Killer Within movie online http://dailybooth.com/rdentersjes/21852623 A Killer Within director welcome to A Killer Within A Killer Within movie yahoo posters A Killer Within real A Killer Within suit A Killer Within dvd blu ray A Killer Within games free online A Killer Within movie location A Killer Within movie photos watch A Killer Within movie in hd A Killer Within encyclopedia 3d bluray A Killer Within A Killer Within search watch whole movie of A Killer Within A Killer Within playstation A Killer Within trailer download hd A Killer Within movie on dvd A Killer Within stream A Killer Within A Killer Within song A Killer Within film great quality A Killer Within order of cheap A Killer Within tickets watch A Killer Within for free A Killer Within on megavideo all A Killer Within spells A Killer Within movie in hd A Killer Within blueray A Killer Within all star free A Killer Within websites new A Killer Within A Killer Within new pictures of A Killer Within characters A Killer Within film out download entire A Killer Within movie official A Killer Within trailer buy A Killer Within dvd A Killer Within mp3 songs A Killer Within movie length review of A Killer Within uncut A Killer Within A Killer Within opening credits A Killer Within in order 3 d A Killer Within A Killer Within movie show times actors in A Killer Within first edition A Killer Within buy A Killer Within movie online
+
 
http://dailybooth.com/passpardo348/21852643 website to watch Jill Rips movie Jill Rips film synopsis full Jill Rips it film hd Jill Rips answers Jill Rips online gameplay Jill Rips film wiki Jill Rips on line how to download Jill Rips full movie Jill Rips rating is Jill Rips on dvd movie trailer Jill Rips online Jill Rips on demand to watch Jill Rips movie Jill Rips movie theater download Jill Rips dvdrip download Jill Rips movie full length Jill Rips whistling song download the movie fast Jill Rips Jill Rips song download cast of Jill Rips Jill Rips list of movies Jill Rips movie posters Jill Rips film watch it Jill Rips it music definition of Jill Rips Jill Rips scene Jill Rips movie questions where can i download Jill Rips movie online Jill Rips avc to download Jill Rips film watch Jill Rips 2010 full movie 3d bluray Jill Rips Jill Rips movie timings Jill Rips flv watch online Jill Rips Jill Rips filming make your own Jill Rips Jill Rips movie tickets Jill Rips albums watch Jill Rips online for free play Jill Rips game online buy Jill Rips wb Jill Rips shop real Jill Rips movie download website to watch Jill Rips movie Jill Rips film synopsis full Jill Rips it film hd Jill Rips answers Jill Rips online gameplay Jill Rips film wiki Jill Rips on line how to download Jill Rips full movie Jill Rips rating is Jill Rips on dvd movie trailer Jill Rips online Jill Rips on demand to watch Jill Rips movie Jill Rips movie theater download Jill Rips dvdrip download Jill Rips movie full length Jill Rips whistling song download the movie fast Jill Rips Jill Rips song download cast of Jill Rips Jill Rips list of movies Jill Rips movie posters Jill Rips film watch it Jill Rips it music definition of Jill Rips Jill Rips scene Jill Rips movie questions where can i download Jill Rips movie online Jill Rips avc to download Jill Rips film watch Jill Rips 2010 full movie 3d bluray Jill Rips Jill Rips movie timings Jill Rips flv watch online Jill Rips Jill Rips filming make your own Jill Rips Jill Rips movie tickets Jill Rips albums watch Jill Rips online for free play Jill Rips game online buy Jill Rips wb Jill Rips shop real Jill Rips movie download
+
Случается, что в работе некоторого алгоритма возникают четко определенные функциональные подсистемы, которые, однако, слишком зависимы от самого алгоритма, либо слишком просты для того, чтобы выделять их в отдельную функцию. В случае с C++ это все же приходится делать, даже если эта "минифункция" применяется всего в одном методе, но достаточное количество раз, чтобы программист не захотел копировать эти строки.
One Way Out movie download dvd rip free download One Way Out game One Way Out movie ending ringtones One Way Out One Way Out film download link One Way Out graphic download One Way Out disney is there a One Way Out which One Way Out character are you One Way Out it film opening One Way Out movie online megavideo free online games One Way Out One Way Out soundtrack youtube One Way Out vol part stream One Way Out online One Way Out movie to download full One Way Out computer games songs on One Way Out posters One Way Out One Way Out games online sound track One Way Out One Way Out chats animated One Way Out One Way Out torrent pictures One Way Out One Way Out pda One Way Out chatting websites One Way Out characters pictures a One Way Out buy One Way Out blu ray http://dailybooth.com/passpardo348/21852651 One Way Out movie download dvd rip free download One Way Out game One Way Out movie ending ringtones One Way Out One Way Out film download link One Way Out graphic download One Way Out disney is there a One Way Out which One Way Out character are you One Way Out it film opening One Way Out movie online megavideo free online games One Way Out One Way Out soundtrack youtube One Way Out vol part stream One Way Out online One Way Out movie to download full One Way Out computer games songs on One Way Out posters One Way Out One Way Out games online sound track One Way Out One Way Out chats animated One Way Out One Way Out torrent pictures One Way Out One Way Out pda One Way Out chatting websites One Way Out characters pictures a One Way Out buy One Way Out blu ray
+
 
http://dailybooth.com/passpardo348/21852659 Poker Run movie clips the movie Poker Run Poker Run whistling song Poker Run extended blu ray release date Poker Run vol cast Poker Run psx dvd quality Poker Run ipod Poker Run movie download for pc blu ray Poker Run extended edition Poker Run people games play Poker Run game Poker Run blu ray Poker Run theaters buy Poker Run movie high quality tickets to Poker Run Poker Run games online free full Poker Run film high quality Poker Run latest movie Poker Run 3d blueray fast Poker Run movie stream Poker Run film watch full film explain Poker Run Poker Run sub Poker Run actor list Poker Run full lenght film in dvd format Poker Run review film Poker Run film cinema fast Poker Run trailer download download Poker Run full movie hd watch Poker Run film divx websites to watch Poker Run movie the whole Poker Run film online download of Poker Run film Poker Run discussion questions Poker Run movie length Poker Run film watch it full movie online Poker Run buy movies Poker Run cheap Poker Run dvd extended Poker Run megavideo link Poker Run 1080p rapidshare Poker Run fancy dress Poker Run film dvd quality song from Poker Run trailer mp3 Poker Run download Poker Run movie in dvd quality Poker Run special extended edition whistle song in Poker Run Poker Run movie clips the movie Poker Run Poker Run whistling song Poker Run extended blu ray release date Poker Run vol cast Poker Run psx dvd quality Poker Run ipod Poker Run movie download for pc blu ray Poker Run extended edition Poker Run people games play Poker Run game Poker Run blu ray Poker Run theaters buy Poker Run movie high quality tickets to Poker Run Poker Run games online free full Poker Run film high quality Poker Run latest movie Poker Run 3d blueray fast Poker Run movie stream Poker Run film watch full film explain Poker Run Poker Run sub Poker Run actor list Poker Run full lenght film in dvd format Poker Run review film Poker Run film cinema fast Poker Run trailer download download Poker Run full movie hd watch Poker Run film divx websites to watch Poker Run movie the whole Poker Run film online download of Poker Run film Poker Run discussion questions Poker Run movie length Poker Run film watch it full movie online Poker Run buy movies Poker Run cheap Poker Run dvd extended Poker Run megavideo link Poker Run 1080p rapidshare Poker Run fancy dress Poker Run film dvd quality song from Poker Run trailer mp3 Poker Run download Poker Run movie in dvd quality Poker Run special extended edition whistle song in Poker Run
+
В других случаях, может возникнуть желание вынести некоторый функционал за пределы текущей функции, или даже предоставить программисту-пользователю возможность самому определить его.
is Cyborg Cop 3d Cyborg Cop chat websites Cyborg Cop music soundtrack free online games Cyborg Cop fast Cyborg Cop online divx Cyborg Cop game 3d Cyborg Cop movie music Cyborg Cop timeline of events download Cyborg Cop free Cyborg Cop for website how to download Cyborg Cop film Cyborg Cop movie release date Cyborg Cop and film movie theaters playing Cyborg Cop Cyborg Cop on blu ray release date Cyborg Cop blu ray Cyborg Cop Cyborg Cop online review Cyborg Cop film facts Cyborg Cop soundtrack free download where to buy Cyborg Cop film Cyborg Cop dvdrip download Cyborg Cop official site Cyborg Cop new movie Cyborg Cop for sale Cyborg Cop final scene when is Cyborg Cop coming out watch Cyborg Cop movie online remote control Cyborg Cop song in Cyborg Cop trailer Cyborg Cop all star watch fast Cyborg Cop movie in high quality where to buy Cyborg Cop Cyborg Cop movie part Cyborg Cop movie wallpaper Cyborg Cop blu ray extended edition want to watch Cyborg Cop movie 3d dvd Cyborg Cop Cyborg Cop overrated Cyborg Cop tickets all of Cyborg Cop movies how many Cyborg Cop movies Cyborg Cop mov where to see Cyborg Cop Cyborg Cop oscar http://dailybooth.com/passpardo348/21852663 is Cyborg Cop 3d Cyborg Cop chat websites Cyborg Cop music soundtrack free online games Cyborg Cop fast Cyborg Cop online divx Cyborg Cop game 3d Cyborg Cop movie music Cyborg Cop timeline of events download Cyborg Cop free Cyborg Cop for website how to download Cyborg Cop film Cyborg Cop movie release date Cyborg Cop and film movie theaters playing Cyborg Cop Cyborg Cop on blu ray release date Cyborg Cop blu ray Cyborg Cop Cyborg Cop online review Cyborg Cop film facts Cyborg Cop soundtrack free download where to buy Cyborg Cop film Cyborg Cop dvdrip download Cyborg Cop official site Cyborg Cop new movie Cyborg Cop for sale Cyborg Cop final scene when is Cyborg Cop coming out watch Cyborg Cop movie online remote control Cyborg Cop song in Cyborg Cop trailer Cyborg Cop all star watch fast Cyborg Cop movie in high quality where to buy Cyborg Cop Cyborg Cop movie part Cyborg Cop movie wallpaper Cyborg Cop blu ray extended edition want to watch Cyborg Cop movie 3d dvd Cyborg Cop Cyborg Cop overrated Cyborg Cop tickets all of Cyborg Cop movies how many Cyborg Cop movies Cyborg Cop mov where to see Cyborg Cop Cyborg Cop oscar
+
 
http://dailybooth.com/passpardo348/21852681 Tribute creation actress Tribute Tribute gifts download Tribute film in ipod quality Tribute extended edition blu ray the original Tribute Tribute stores download movie Tribute hd play Tribute online without downloading Tribute 3d collection Tribute dvd stream whistling song from Tribute Tribute live Tribute to buy Tribute film out Tribute movie download full movie voice of dory in Tribute Tribute limited edition Tribute free games Tribute 720p hotfile is Tribute on dvd yet Tribute movie download link Tribute game trailer Tribute soundtrack song Tribute online stream watch the whole Tribute movie bluray Tribute Tribute film still Tribute wallpapers Tribute online membership Tribute film great quality Tribute trailer download Tribute music director Tribute fan Tribute creation actress Tribute Tribute gifts download Tribute film in ipod quality Tribute extended edition blu ray the original Tribute Tribute stores download movie Tribute hd play Tribute online without downloading Tribute 3d collection Tribute dvd stream whistling song from Tribute Tribute live Tribute to buy Tribute film out Tribute movie download full movie voice of dory in Tribute Tribute limited edition Tribute free games Tribute 720p hotfile is Tribute on dvd yet Tribute movie download link Tribute game trailer Tribute soundtrack song Tribute online stream watch the whole Tribute movie bluray Tribute Tribute film still Tribute wallpapers Tribute online membership Tribute film great quality Tribute trailer download Tribute music director Tribute fan
+
И в том и в другом случае на помощь приходят ''замыкания'', ''анонимные функции'' или ''лямбда функции'', как их еще называют. Сущность такой функции в том, что она с одной стороны как бы является переменной, а с другой стороны — функцией, которую можно вызывать. В языке К++, такие функции носят название блоков. Сущность переменной, блоки проявляют в том что их можно создавать как локальные переменные, присваивать друг другу и даже передавать другим функциям в качестве параметра. Приняв такой параметр, функция может обратиться к нему, как к любой другой функции: вызывать с некоторыми параметрами и использовать его возвращаемое значение:
Love Human Remains movie to download where can i watch Love Human Remains best Love Human Remains quotes Love Human Remains itunes Love Human Remains blue ray extended edition stars of Love Human Remains Love Human Remains wav Love Human Remains film full hd Love Human Remains extended bluray release date Love Human Remains Love Human Remains image Love Human Remains wide release Love Human Remains full film in hd length of Love Human Remains movie download Love Human Remains film hd latest Love Human Remains film direct download Love Human Remains movie audiobook Love Human Remains Love Human Remains song lyrics Love Human Remains world Love Human Remains true story Love Human Remains where playing to download Love Human Remains film Love Human Remains rated dvd release date Love Human Remains Love Human Remains writer movie Love Human Remains ending download whole Love Human Remains movie whistle from Love Human Remains Love Human Remains stars Love Human Remains cinema Love Human Remains items where can i download Love Human Remains trailer where to buy Love Human Remains watch Love Human Remains for free download Love Human Remains musical the full Love Human Remains movie Love Human Remains oscar nomination end of Love Human Remains Love Human Remains profile buy and download Love Human Remains movie online Love Human Remains on line free download Love Human Remains it watch the complete Love Human Remains it movie free movies Love Human Remains music of Love Human Remains Love Human Remains release date dvd all Love Human Remains movies http://dailybooth.com/passpardo348/21852716 Love Human Remains movie to download where can i watch Love Human Remains best Love Human Remains quotes Love Human Remains itunes Love Human Remains blue ray extended edition stars of Love Human Remains Love Human Remains wav Love Human Remains film full hd Love Human Remains extended bluray release date Love Human Remains Love Human Remains image Love Human Remains wide release Love Human Remains full film in hd length of Love Human Remains movie download Love Human Remains film hd latest Love Human Remains film direct download Love Human Remains movie audiobook Love Human Remains Love Human Remains song lyrics Love Human Remains world Love Human Remains true story Love Human Remains where playing to download Love Human Remains film Love Human Remains rated dvd release date Love Human Remains Love Human Remains writer movie Love Human Remains ending download whole Love Human Remains movie whistle from Love Human Remains Love Human Remains stars Love Human Remains cinema Love Human Remains items where can i download Love Human Remains trailer where to buy Love Human Remains watch Love Human Remains for free download Love Human Remains musical the full Love Human Remains movie Love Human Remains oscar nomination end of Love Human Remains Love Human Remains profile buy and download Love Human Remains movie online Love Human Remains on line free download Love Human Remains it watch the complete Love Human Remains it movie free movies Love Human Remains music of Love Human Remains Love Human Remains release date dvd all Love Human Remains movies
+
<source lang="kpp">
web Joy et Joan Joy et Joan oscar nominations Joy et Joan dvd5 Joy et Joan seasons Joy et Joan pc game Joy et Joan it film watch films Joy et Joan clips Joy et Joan awards list Joy et Joan ipod Joy et Joan episodes Joy et Joan storyboard Joy et Joan ps2 game download fast Joy et Joan film in hd quality whistle from Joy et Joan Joy et Joan dvd sale movie trailer Joy et Joan actors in Joy et Joan whistle song Joy et Joan movie reviews Joy et Joan Joy et Joan final scene Joy et Joan in theatres Joy et Joan film premiere Joy et Joan watch full movie where to download the fast Joy et Joan movie Joy et Joan blu ray extended release date Joy et Joan trailer download Joy et Joan movie download avi Joy et Joan free streaming download Joy et Joan online for free Joy et Joan online promo code Joy et Joan screencaps Joy et Joan movie ending imdb Joy et Joan Joy et Joan times ringtone Joy et Joan Joy et Joan movie information soundtrack to Joy et Joan download whole Joy et Joan movie Joy et Joan film online http://conriter.over-blog.com/article-.html web Joy et Joan Joy et Joan oscar nominations Joy et Joan dvd5 Joy et Joan seasons Joy et Joan pc game Joy et Joan it film watch films Joy et Joan clips Joy et Joan awards list Joy et Joan ipod Joy et Joan episodes Joy et Joan storyboard Joy et Joan ps2 game download fast Joy et Joan film in hd quality whistle from Joy et Joan Joy et Joan dvd sale movie trailer Joy et Joan actors in Joy et Joan whistle song Joy et Joan movie reviews Joy et Joan Joy et Joan final scene Joy et Joan in theatres Joy et Joan film premiere Joy et Joan watch full movie where to download the fast Joy et Joan movie Joy et Joan blu ray extended release date Joy et Joan trailer download Joy et Joan movie download avi Joy et Joan free streaming download Joy et Joan online for free Joy et Joan online promo code Joy et Joan screencaps Joy et Joan movie ending imdb Joy et Joan Joy et Joan times ringtone Joy et Joan Joy et Joan movie information soundtrack to Joy et Joan download whole Joy et Joan movie Joy et Joan film online
+
function Caller(x, y, block b) {
Munchies uncut dvd imdb Munchies Munchies online classes Munchies mediafire movies 1st edition Munchies watch full version of Munchies online watch full version of Munchies film Munchies film with good quality Munchies top uncut Munchies free Munchies online Munchies game make an Munchies Munchies for sale Munchies movie film all Munchies movies in order make Munchies online Munchies movie photos Munchies all star Munchies music sheet where to watch the whole Munchies film Munchies movie rating Munchies screenshots new Munchies trailer is Munchies on blu ray Munchies film bits watch Munchies film high quality pictures from Munchies explain Munchies movie xbox 360 Munchies original Munchies dvd Munchies online Munchies film songs Munchies catalog Munchies online demo Munchies music score Munchies it movie download sites Munchies film download full film http://dailybooth.com/passpardo348/21852743 Munchies uncut dvd imdb Munchies Munchies online classes Munchies mediafire movies 1st edition Munchies watch full version of Munchies online watch full version of Munchies film Munchies film with good quality Munchies top uncut Munchies free Munchies online Munchies game make an Munchies Munchies for sale Munchies movie film all Munchies movies in order make Munchies online Munchies movie photos Munchies all star Munchies music sheet where to watch the whole Munchies film Munchies movie rating Munchies screenshots new Munchies trailer is Munchies on blu ray Munchies film bits watch Munchies film high quality pictures from Munchies explain Munchies movie xbox 360 Munchies original Munchies dvd Munchies online Munchies film songs Munchies catalog Munchies online demo Munchies music score Munchies it movie download sites Munchies film download full film
+
    return b(x, y);
http://conriter.over-blog.com/article-high-quality-fear-of-flying-1999-film-95874742.html watch Fear of Flying vol online Fear of Flying suitcase
+
}
http://dailybooth.com/tograca726/21852760 Will Grace Say Goodnight Gracie main characters Will Grace Say Goodnight Gracie free download movie
+
</source>
new movies 2011 http://conriter.over-blog.com/article-tu-sday-2008-stream-online-95874777.html download Tu sday games
+
 
i found a Franklin lyrics http://conriter.over-blog.com/article-quality-franklin-1997-tv-series-full-movie-95874823.html rules Franklin
+
Приведем простой пример объявления блоков и их передачи в вышеописанную функцию:
 +
<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++. В целом, у каждого языка есть свои преимущества и недостатки и в общем случае сравнивать их нельзя. Можно, разве что, судить о степени удобства языка, в сочетании с его производительностью и о том, насколько эффективно он позволяет решать задачи, на которые был рассчитан и исходя из которых проектировался.

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

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