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

Материал из Deeptown Manual
Перейти к: навигация, поиск
(Pursued movie clips Pursued characters wiki Pursued raleigh Pursued mp4 megaupload secrets of Pursued Pursued vol quotes Pursued filming location Pursued awards list Pursued online for free download f)
 
(не показаны 22 407 промежуточных версий 4 участников)
Строка 1: Строка 1:
Pursued movie clips Pursued characters wiki Pursued raleigh Pursued mp4 megaupload secrets of Pursued Pursued vol quotes Pursued filming location Pursued awards list Pursued online for free download for Pursued movie Pursued productions i want to watch Pursued film Pursued movie 3d Pursued main character watch Pursued free online Pursued movie download avi Pursued where is it playing Pursued audio clips Pursued movie stream Pursued replicas Pursued movie locations Pursued video game trailer Pursued logos download Pursued movie free Pursued rating info Pursued movie set full Pursued movie to watch Pursued movie bits Pursued movie download 1080p Pursued trailer mp4 download Pursued divx fast Pursued website soundtrack Pursued twitter Pursued Pursued cutting scene Pursued vol music watch Pursued megavideo Pursued vol blu ray bluray Pursued http://ineedin.over-blog.com/article-fast-pursued-1947-film-high-quality-95873805.html Pursued movie clips Pursued characters wiki Pursued raleigh Pursued mp4 megaupload secrets of Pursued Pursued vol quotes Pursued filming location Pursued awards list Pursued online for free download for Pursued movie Pursued productions i want to watch Pursued film Pursued movie 3d Pursued main character watch Pursued free online Pursued movie download avi Pursued where is it playing Pursued audio clips Pursued movie stream Pursued replicas Pursued movie locations Pursued video game trailer Pursued logos download Pursued movie free Pursued rating info Pursued movie set full Pursued movie to watch Pursued movie bits Pursued movie download 1080p Pursued trailer mp4 download Pursued divx fast Pursued website soundtrack Pursued twitter Pursued Pursued cutting scene Pursued vol music watch Pursued megavideo Pursued vol blu ray bluray Pursued
+
__TOC__
buy The Ultimate Weapon tide live hard The Ultimate Weapon the movie The Ultimate Weapon The Ultimate Weapon and film full film of The Ultimate Weapon online definition of The Ultimate Weapon downloadable films The Ultimate Weapon online The Ultimate Weapon best movie ever running The Ultimate Weapon The Ultimate Weapon soundboard download divx The Ultimate Weapon movie The Ultimate Weapon 720p The Ultimate Weapon special edition The Ultimate Weapon mmorpg were can i download The Ultimate Weapon movie The Ultimate Weapon digital copy The Ultimate Weapon movie film The Ultimate Weapon blu ray release where does The Ultimate Weapon live The Ultimate Weapon movie plot The Ultimate Weapon director cut download The Ultimate Weapon movie rapidshare watch full version The Ultimate Weapon movie The Ultimate Weapon movie meaning download The Ultimate Weapon 3d The Ultimate Weapon screenplay The Ultimate Weapon fanclub The Ultimate Weapon collection blu ray download The Ultimate Weapon trailer the whole The Ultimate Weapon movie google The Ultimate Weapon The Ultimate Weapon photo gallery where to watch the full The Ultimate Weapon film http://dailybooth.com/rdentersjes/21852577 buy The Ultimate Weapon tide live hard The Ultimate Weapon the movie The Ultimate Weapon The Ultimate Weapon and film full film of The Ultimate Weapon online definition of The Ultimate Weapon downloadable films The Ultimate Weapon online The Ultimate Weapon best movie ever running The Ultimate Weapon The Ultimate Weapon soundboard download divx The Ultimate Weapon movie The Ultimate Weapon 720p The Ultimate Weapon special edition The Ultimate Weapon mmorpg were can i download The Ultimate Weapon movie The Ultimate Weapon digital copy The Ultimate Weapon movie film The Ultimate Weapon blu ray release where does The Ultimate Weapon live The Ultimate Weapon movie plot The Ultimate Weapon director cut download The Ultimate Weapon movie rapidshare watch full version The Ultimate Weapon movie The Ultimate Weapon movie meaning download The Ultimate Weapon 3d The Ultimate Weapon screenplay The Ultimate Weapon fanclub The Ultimate Weapon collection blu ray download The Ultimate Weapon trailer the whole The Ultimate Weapon movie google The Ultimate Weapon The Ultimate Weapon photo gallery where to watch the full The Ultimate Weapon film
+
 
http://ineedin.over-blog.com/article-where-to-watch-the-full-waco-the-rules-of-engagement-1997-documentary-film-95873833.html Waco The Rules of Engagement rated play Waco The Rules of Engagement rent Waco The Rules of Engagement Waco The Rules of Engagement online youtube Waco The Rules of Engagement movie download megaupload dvd release date Waco The Rules of Engagement Waco The Rules of Engagement theaters Waco The Rules of Engagement dvd 3d the full Waco The Rules of Engagement it tide movie Waco The Rules of Engagement download megaupload download the whole movie of Waco The Rules of Engagement Waco The Rules of Engagement pack filmation Waco The Rules of Engagement blue ray Waco The Rules of Engagement explanation of Waco The Rules of Engagement Waco The Rules of Engagement release dates Waco The Rules of Engagement free online games Waco The Rules of Engagement film watch film Waco The Rules of Engagement audiobooks Waco The Rules of Engagement poet Waco The Rules of Engagement dialogues Waco The Rules of Engagement tvrip interactive Waco The Rules of Engagement games download Waco The Rules of Engagement film in divx formats Waco The Rules of Engagement story Waco The Rules of Engagement online forums free Waco The Rules of Engagement movies quotes from Waco The Rules of Engagement utorrent Waco The Rules of Engagement watch Waco The Rules of Engagement volume Waco The Rules of Engagement movie download iphone Waco The Rules of Engagement movie download Waco The Rules of Engagement volume make Waco The Rules of Engagement Waco The Rules of Engagement music director download hd Waco The Rules of Engagement it Waco The Rules of Engagement episode list Waco The Rules of Engagement movie review Waco The Rules of Engagement film sales Waco The Rules of Engagement rated play Waco The Rules of Engagement rent Waco The Rules of Engagement Waco The Rules of Engagement online youtube Waco The Rules of Engagement movie download megaupload dvd release date Waco The Rules of Engagement Waco The Rules of Engagement theaters Waco The Rules of Engagement dvd 3d the full Waco The Rules of Engagement it tide movie Waco The Rules of Engagement download megaupload download the whole movie of Waco The Rules of Engagement Waco The Rules of Engagement pack filmation Waco The Rules of Engagement blue ray Waco The Rules of Engagement explanation of Waco The Rules of Engagement Waco The Rules of Engagement release dates Waco The Rules of Engagement free online games Waco The Rules of Engagement film watch film Waco The Rules of Engagement audiobooks Waco The Rules of Engagement poet Waco The Rules of Engagement dialogues Waco The Rules of Engagement tvrip interactive Waco The Rules of Engagement games download Waco The Rules of Engagement film in divx formats Waco The Rules of Engagement story Waco The Rules of Engagement online forums free Waco The Rules of Engagement movies quotes from Waco The Rules of Engagement utorrent Waco The Rules of Engagement watch Waco The Rules of Engagement volume Waco The Rules of Engagement movie download iphone Waco The Rules of Engagement movie download Waco The Rules of Engagement volume make Waco The Rules of Engagement Waco The Rules of Engagement music director download hd Waco The Rules of Engagement it Waco The Rules of Engagement episode list Waco The Rules of Engagement movie review Waco The Rules of Engagement film sales
+
Основной идеей при написании как процедурных, так и объектно-ориентированных программ является локализация (заключение) функционала в некоторой области: в функции, либо в методе. Таким образом получается, что программа состоит из множества функционально независимых частей, каждая из которых решает конкретную, достаточно узкую задачу. Такой подход позволяет скрыть детали реализации алгоритмов внутри этих частей, а "наружу" предоставить только интерфейс — совокупность способов взаимодействия данного функционального элемента с другими. В случае функции, под интерфейсом понимается совокупность ее параметров и возвращаемого значения; в случае классов — наборы методов и свойств.
http://dailybooth.com/rdentersjes/21852585 movie net Son cellat online Son cellat photo gallery Son cellat movie download for psp Son cellat credits Son cellat real man download movie Son cellat in ipod download Son cellat movie dvd Son cellat 3d trailer Son cellat icon Son cellat release cities download Son cellat song Son cellat movie quality download the whole film of Son cellat the whole Son cellat movie watch Son cellat movie online free where can i download Son cellat movie windows Son cellat wallpapers downloads Son cellat online Son cellat forum Son cellat soundtrack song free Son cellat online Son cellat film sales Son cellat suits for sale Son cellat sound button to download Son cellat film reviews on Son cellat buy Son cellat blu ray fast Son cellat download full movie Son cellat cutting scene download Son cellat movie ipod Son cellat hd download Son cellat official trailer Son cellat fanclub all Son cellat fast Son cellat movie screenshots Son cellat movie ending Son cellat psp game Son cellat watch movie explain Son cellat movie illegal Son cellat movie download is Son cellat real cover Son cellat dvd movie net Son cellat online Son cellat photo gallery Son cellat movie download for psp Son cellat credits Son cellat real man download movie Son cellat in ipod download Son cellat movie dvd Son cellat 3d trailer Son cellat icon Son cellat release cities download Son cellat song Son cellat movie quality download the whole film of Son cellat the whole Son cellat movie watch Son cellat movie online free where can i download Son cellat movie windows Son cellat wallpapers downloads Son cellat online Son cellat forum Son cellat soundtrack song free Son cellat online Son cellat film sales Son cellat suits for sale Son cellat sound button to download Son cellat film reviews on Son cellat buy Son cellat blu ray fast Son cellat download full movie Son cellat cutting scene download Son cellat movie ipod Son cellat hd download Son cellat official trailer Son cellat fanclub all Son cellat fast Son cellat movie screenshots Son cellat movie ending Son cellat psp game Son cellat watch movie explain Son cellat movie illegal Son cellat movie download is Son cellat real cover Son cellat dvd
+
 
http://ineedin.over-blog.com/article-download-daddy-s-girl-2006-films-95873856.html Daddy s Girl collection dvd Daddy s Girl full film online Daddy s Girl analysis is Daddy s Girl good new Daddy s Girl release date Daddy s Girl soundtrack track list music from Daddy s Girl vol buy the film Daddy s Girl Daddy s Girl audiobook download download Daddy s Girl movie for ipod Daddy s Girl awards is Daddy s Girl out on dvd where to watch the full Daddy s Girl film picture of Daddy s Girl running Daddy s Girl gift set free download Daddy s Girl it Daddy s Girl tv spot your own Daddy s Girl Daddy s Girl avi Daddy s Girl movie download good quality explain Daddy s Girl movie Daddy s Girl overview Daddy s Girl previews Daddy s Girl movie download for pc new york Daddy s Girl watch Daddy s Girl online dvd quality Daddy s Girl streaming Daddy s Girl cutting scene Daddy s Girl gamers audiobook Daddy s Girl Daddy s Girl playstation Daddy s Girl collection dvd Daddy s Girl full film online Daddy s Girl analysis is Daddy s Girl good new Daddy s Girl release date Daddy s Girl soundtrack track list music from Daddy s Girl vol buy the film Daddy s Girl Daddy s Girl audiobook download download Daddy s Girl movie for ipod Daddy s Girl awards is Daddy s Girl out on dvd where to watch the full Daddy s Girl film picture of Daddy s Girl running Daddy s Girl gift set free download Daddy s Girl it Daddy s Girl tv spot your own Daddy s Girl Daddy s Girl avi Daddy s Girl movie download good quality explain Daddy s Girl movie Daddy s Girl overview Daddy s Girl previews Daddy s Girl movie download for pc new york Daddy s Girl watch Daddy s Girl online dvd quality Daddy s Girl streaming Daddy s Girl cutting scene Daddy s Girl gamers audiobook Daddy s Girl Daddy s Girl playstation
+
Случается, что в работе некоторого алгоритма возникают четко определенные функциональные подсистемы, которые, однако, слишком зависимы от самого алгоритма, либо слишком просты для того, чтобы выделять их в отдельную функцию. В случае с C++ это все же приходится делать, даже если эта "минифункция" применяется всего в одном методе, но достаточное количество раз, чтобы программист не захотел копировать эти строки.
quotes from Why I Wore Lipstick to My Mastectomy dory Why I Wore Lipstick to My Mastectomy online download for pc watch a movie Why I Wore Lipstick to My Mastectomy online whistle Why I Wore Lipstick to My Mastectomy Why I Wore Lipstick to My Mastectomy games movie Why I Wore Lipstick to My Mastectomy plot Why I Wore Lipstick to My Mastectomy film cinema Why I Wore Lipstick to My Mastectomy suit want to watch Why I Wore Lipstick to My Mastectomy movie Why I Wore Lipstick to My Mastectomy free movie download Why I Wore Lipstick to My Mastectomy film in hd Why I Wore Lipstick to My Mastectomy suit for sale Why I Wore Lipstick to My Mastectomy languages Why I Wore Lipstick to My Mastectomy game trailer Why I Wore Lipstick to My Mastectomy movie awards Why I Wore Lipstick to My Mastectomy mobile game Why I Wore Lipstick to My Mastectomy movie pic Why I Wore Lipstick to My Mastectomy cd Why I Wore Lipstick to My Mastectomy cinematography bloat from Why I Wore Lipstick to My Mastectomy Why I Wore Lipstick to My Mastectomy movie dvd release date Why I Wore Lipstick to My Mastectomy movie clips download Why I Wore Lipstick to My Mastectomy best price Why I Wore Lipstick to My Mastectomy soundboard Why I Wore Lipstick to My Mastectomy official merchandise when will Why I Wore Lipstick to My Mastectomy be released screenplay Why I Wore Lipstick to My Mastectomy buy movies Why I Wore Lipstick to My Mastectomy cheap Why I Wore Lipstick to My Mastectomy story Why I Wore Lipstick to My Mastectomy bluray release date Why I Wore Lipstick to My Mastectomy film bits high quality Why I Wore Lipstick to My Mastectomy film movie quality Why I Wore Lipstick to My Mastectomy purchase movie online Why I Wore Lipstick to My Mastectomy Why I Wore Lipstick to My Mastectomy movie showings Why I Wore Lipstick to My Mastectomy online Why I Wore Lipstick to My Mastectomy on megavideo buy Why I Wore Lipstick to My Mastectomy dvd Why I Wore Lipstick to My Mastectomy free online Why I Wore Lipstick to My Mastectomy shopping movie Why I Wore Lipstick to My Mastectomy awards list http://brontisbthimb.jugem.jp/?eid=4 quotes from Why I Wore Lipstick to My Mastectomy dory Why I Wore Lipstick to My Mastectomy online download for pc watch a movie Why I Wore Lipstick to My Mastectomy online whistle Why I Wore Lipstick to My Mastectomy Why I Wore Lipstick to My Mastectomy games movie Why I Wore Lipstick to My Mastectomy plot Why I Wore Lipstick to My Mastectomy film cinema Why I Wore Lipstick to My Mastectomy suit want to watch Why I Wore Lipstick to My Mastectomy movie Why I Wore Lipstick to My Mastectomy free movie download Why I Wore Lipstick to My Mastectomy film in hd Why I Wore Lipstick to My Mastectomy suit for sale Why I Wore Lipstick to My Mastectomy languages Why I Wore Lipstick to My Mastectomy game trailer Why I Wore Lipstick to My Mastectomy movie awards Why I Wore Lipstick to My Mastectomy mobile game Why I Wore Lipstick to My Mastectomy movie pic Why I Wore Lipstick to My Mastectomy cd Why I Wore Lipstick to My Mastectomy cinematography bloat from Why I Wore Lipstick to My Mastectomy Why I Wore Lipstick to My Mastectomy movie dvd release date Why I Wore Lipstick to My Mastectomy movie clips download Why I Wore Lipstick to My Mastectomy best price Why I Wore Lipstick to My Mastectomy soundboard Why I Wore Lipstick to My Mastectomy official merchandise when will Why I Wore Lipstick to My Mastectomy be released screenplay Why I Wore Lipstick to My Mastectomy buy movies Why I Wore Lipstick to My Mastectomy cheap Why I Wore Lipstick to My Mastectomy story Why I Wore Lipstick to My Mastectomy bluray release date Why I Wore Lipstick to My Mastectomy film bits high quality Why I Wore Lipstick to My Mastectomy film movie quality Why I Wore Lipstick to My Mastectomy purchase movie online Why I Wore Lipstick to My Mastectomy Why I Wore Lipstick to My Mastectomy movie showings Why I Wore Lipstick to My Mastectomy online Why I Wore Lipstick to My Mastectomy on megavideo buy Why I Wore Lipstick to My Mastectomy dvd Why I Wore Lipstick to My Mastectomy free online Why I Wore Lipstick to My Mastectomy shopping movie Why I Wore Lipstick to My Mastectomy awards list
+
 
download Do koske film legally Do koske extended version dvd movie times for Do koske game Do koske where to watch the full Do koske movie Do koske opening watch Do koske full movie high quality download Do koske film in ipod quality Do koske real story cheap Do koske tickets new Do koske trailer Do koske products watch free online buy Do koske movie where to watch Do koske movie download Do koske movie bootleg watch film of Do koske downloadable films Do koske online Do koske pic Do koske film watch full film movie Do koske showtimes download Do koske it movie legally make own Do koske free movie Do koske Do koske hqrip free download Do koske it Do koske printables song from Do koske trailer is Do koske on dvd yet were can i download Do koske movie Do koske clips Do koske movie now Do koske audio Do koske movie spoiler download Do koske music virtual Do koske games games Do koske download the new Do koske movie Do koske tv show http://www.ign.com/blogs/enenpa/?p=36 amp preview=true download Do koske film legally Do koske extended version dvd movie times for Do koske game Do koske where to watch the full Do koske movie Do koske opening watch Do koske full movie high quality download Do koske film in ipod quality Do koske real story cheap Do koske tickets new Do koske trailer Do koske products watch free online buy Do koske movie where to watch Do koske movie download Do koske movie bootleg watch film of Do koske downloadable films Do koske online Do koske pic Do koske film watch full film movie Do koske showtimes download Do koske it movie legally make own Do koske free movie Do koske Do koske hqrip free download Do koske it Do koske printables song from Do koske trailer is Do koske on dvd yet were can i download Do koske movie Do koske clips Do koske movie now Do koske audio Do koske movie spoiler download Do koske music virtual Do koske games games Do koske download the new Do koske movie Do koske tv show
+
В других случаях, может возникнуть желание вынести некоторый функционал за пределы текущей функции, или даже предоставить программисту-пользователю возможность самому определить его.
http://dailybooth.com/rdentersjes/21852589 watch movie Harum Scarum watch the full movie of Harum Scarum online the movie Harum Scarum Harum Scarum movie show times watch Harum Scarum streaming Harum Scarum patches Harum Scarum clipart download Harum Scarum film hd all Harum Scarum movies free Harum Scarum games Harum Scarum fanclub a Harum Scarum world download Harum Scarum hd free Harum Scarum movie review of Harum Scarum download legal divx Harum Scarum movie Harum Scarum episode where is Harum Scarum showing Harum Scarum ps2 games Harum Scarum customs Harum Scarum awards Harum Scarum movie tickets Harum Scarum bluray 3d Harum Scarum 3d showtimes is Harum Scarum on blu ray where can i download Harum Scarum online Harum Scarum film download part Harum Scarum online map Harum Scarum purchase movie downloads virtual world Harum Scarum the whole Harum Scarum movie Harum Scarum mobile game Harum Scarum logos download Harum Scarum dvdrip subtitle Harum Scarum full Harum Scarum film downloads Harum Scarum divx movie Harum Scarum showtimes Harum Scarum flash games buy Harum Scarum film on dvd Harum Scarum downloading movies Harum Scarum movie download part watch movie Harum Scarum watch the full movie of Harum Scarum online the movie Harum Scarum Harum Scarum movie show times watch Harum Scarum streaming Harum Scarum patches Harum Scarum clipart download Harum Scarum film hd all Harum Scarum movies free Harum Scarum games Harum Scarum fanclub a Harum Scarum world download Harum Scarum hd free Harum Scarum movie review of Harum Scarum download legal divx Harum Scarum movie Harum Scarum episode where is Harum Scarum showing Harum Scarum ps2 games Harum Scarum customs Harum Scarum awards Harum Scarum movie tickets Harum Scarum bluray 3d Harum Scarum 3d showtimes is Harum Scarum on blu ray where can i download Harum Scarum online Harum Scarum film download part Harum Scarum online map Harum Scarum purchase movie downloads virtual world Harum Scarum the whole Harum Scarum movie Harum Scarum mobile game Harum Scarum logos download Harum Scarum dvdrip subtitle Harum Scarum full Harum Scarum film downloads Harum Scarum divx movie Harum Scarum showtimes Harum Scarum flash games buy Harum Scarum film on dvd Harum Scarum downloading movies Harum Scarum movie download part
+
 
watching Zubeidaa online bloat from Zubeidaa download the movie Zubeidaa online Zubeidaa creator games Zubeidaa movie download sites download Zubeidaa divx watch Zubeidaa movie stream Zubeidaa mp3 voice of Zubeidaa Zubeidaa film reviews Zubeidaa scenes Zubeidaa generation movie showtimes Zubeidaa movie review Zubeidaa Zubeidaa dvd price Zubeidaa mobile lab Zubeidaa rapidshare download Zubeidaa chatting Zubeidaa ending extended Zubeidaa ipod buy Zubeidaa movie download xbox live Zubeidaa Zubeidaa pc download Zubeidaa parts Zubeidaa end credits 3d chat Zubeidaa Zubeidaa film part Zubeidaa 3d movie Zubeidaa vol subtitles Zubeidaa uncut dvd watch the entire film of Zubeidaa online Zubeidaa movie download site Zubeidaa tracksuit Zubeidaa pda quotes from dory in Zubeidaa http://ineedin.over-blog.com/article-watch-movie-of-zubeidaa-2001-95873888.html watching Zubeidaa online bloat from Zubeidaa download the movie Zubeidaa online Zubeidaa creator games Zubeidaa movie download sites download Zubeidaa divx watch Zubeidaa movie stream Zubeidaa mp3 voice of Zubeidaa Zubeidaa film reviews Zubeidaa scenes Zubeidaa generation movie showtimes Zubeidaa movie review Zubeidaa Zubeidaa dvd price Zubeidaa mobile lab Zubeidaa rapidshare download Zubeidaa chatting Zubeidaa ending extended Zubeidaa ipod buy Zubeidaa movie download xbox live Zubeidaa Zubeidaa pc download Zubeidaa parts Zubeidaa end credits 3d chat Zubeidaa Zubeidaa film part Zubeidaa 3d movie Zubeidaa vol subtitles Zubeidaa uncut dvd watch the entire film of Zubeidaa online Zubeidaa movie download site Zubeidaa tracksuit Zubeidaa pda quotes from dory in Zubeidaa
+
И в том и в другом случае на помощь приходят ''замыкания'', ''анонимные функции'' или ''лямбда функции'', как их еще называют. Сущность такой функции в том, что она с одной стороны как бы является переменной, а с другой стороны — функцией, которую можно вызывать. В языке К++, такие функции носят название блоков. Сущность переменной, блоки проявляют в том что их можно создавать как локальные переменные, присваивать друг другу и даже передавать другим функциям в качестве параметра. Приняв такой параметр, функция может обратиться к нему, как к любой другой функции: вызывать с некоторыми параметрами и использовать его возвращаемое значение:
http://www.ign.com/blogs/backcotelist/2012/01/01/websites-to-watch-dead-solid-perfect-1988-tv-movie-film/ Dead Solid Perfect best quotes Dead Solid Perfect cheats ps2 subtitle Dead Solid Perfect Dead Solid Perfect utorrents Dead Solid Perfect psx i found a Dead Solid Perfect lyrics Dead Solid Perfect movie on internet Dead Solid Perfect blue ray extended edition download the movie fast Dead Solid Perfect Dead Solid Perfect french song Dead Solid Perfect special edition Dead Solid Perfect download free Dead Solid Perfect downloads download Dead Solid Perfect movie dvdrip Dead Solid Perfect people free Dead Solid Perfect games watch a movie Dead Solid Perfect online Dead Solid Perfect labs Dead Solid Perfect to dvd where to watch Dead Solid Perfect film watch Dead Solid Perfect vol Dead Solid Perfect video games Dead Solid Perfect oscar awards Dead Solid Perfect movie location Dead Solid Perfect mmorpg download Dead Solid Perfect for free full download Dead Solid Perfect movies Dead Solid Perfect movie synopsis Dead Solid Perfect game com flash Dead Solid Perfect Dead Solid Perfect movie wikipedia watch fast Dead Solid Perfect movie in high quality Dead Solid Perfect online membership download dvd quality movies Dead Solid Perfect Dead Solid Perfect part trailer full Dead Solid Perfect movie Dead Solid Perfect film dvd Dead Solid Perfect languages Dead Solid Perfect film to download Dead Solid Perfect dvd rip Dead Solid Perfect fan meaning Dead Solid Perfect store all Dead Solid Perfect rules download Dead Solid Perfect film Dead Solid Perfect on blu ray Dead Solid Perfect film download remake Dead Solid Perfect film bluray Dead Solid Perfect Dead Solid Perfect best quotes Dead Solid Perfect cheats ps2 subtitle Dead Solid Perfect Dead Solid Perfect utorrents Dead Solid Perfect psx i found a Dead Solid Perfect lyrics Dead Solid Perfect movie on internet Dead Solid Perfect blue ray extended edition download the movie fast Dead Solid Perfect Dead Solid Perfect french song Dead Solid Perfect special edition Dead Solid Perfect download free Dead Solid Perfect downloads download Dead Solid Perfect movie dvdrip Dead Solid Perfect people free Dead Solid Perfect games watch a movie Dead Solid Perfect online Dead Solid Perfect labs Dead Solid Perfect to dvd where to watch Dead Solid Perfect film watch Dead Solid Perfect vol Dead Solid Perfect video games Dead Solid Perfect oscar awards Dead Solid Perfect movie location Dead Solid Perfect mmorpg download Dead Solid Perfect for free full download Dead Solid Perfect movies Dead Solid Perfect movie synopsis Dead Solid Perfect game com flash Dead Solid Perfect Dead Solid Perfect movie wikipedia watch fast Dead Solid Perfect movie in high quality Dead Solid Perfect online membership download dvd quality movies Dead Solid Perfect Dead Solid Perfect part trailer full Dead Solid Perfect movie Dead Solid Perfect film dvd Dead Solid Perfect languages Dead Solid Perfect film to download Dead Solid Perfect dvd rip Dead Solid Perfect fan meaning Dead Solid Perfect store all Dead Solid Perfect rules download Dead Solid Perfect film Dead Solid Perfect on blu ray Dead Solid Perfect film download remake Dead Solid Perfect film bluray Dead Solid Perfect
+
<source lang="kpp">
http://dailybooth.com/rdentersjes/21852598 Vengeance Unlimited full lenght movie in dvd format download Vengeance Unlimited online free sound track Vengeance Unlimited Vengeance Unlimited extended ending Vengeance Unlimited film imdb free download Vengeance Unlimited game Vengeance Unlimited full lenght film in pda format Vengeance Unlimited wav Vengeance Unlimited cut out characters Vengeance Unlimited movie Vengeance Unlimited ending torrents Vengeance Unlimited Vengeance Unlimited search Vengeance Unlimited album download Vengeance Unlimited volume song from Vengeance Unlimited Vengeance Unlimited cd Vengeance Unlimited sound effects Vengeance Unlimited soundtrack cd all Vengeance Unlimited spells you tube Vengeance Unlimited quotes from Vengeance Unlimited movie download Vengeance Unlimited film in hd formats Vengeance Unlimited you tube pre order Vengeance Unlimited tickets Vengeance Unlimited online free Vengeance Unlimited blogs 3d Vengeance Unlimited creator Vengeance Unlimited collectors Vengeance Unlimited online game Vengeance Unlimited full lenght movie in dvd format download Vengeance Unlimited online free sound track Vengeance Unlimited Vengeance Unlimited extended ending Vengeance Unlimited film imdb free download Vengeance Unlimited game Vengeance Unlimited full lenght film in pda format Vengeance Unlimited wav Vengeance Unlimited cut out characters Vengeance Unlimited movie Vengeance Unlimited ending torrents Vengeance Unlimited Vengeance Unlimited search Vengeance Unlimited album download Vengeance Unlimited volume song from Vengeance Unlimited Vengeance Unlimited cd Vengeance Unlimited sound effects Vengeance Unlimited soundtrack cd all Vengeance Unlimited spells you tube Vengeance Unlimited quotes from Vengeance Unlimited movie download Vengeance Unlimited film in hd formats Vengeance Unlimited you tube pre order Vengeance Unlimited tickets Vengeance Unlimited online free Vengeance Unlimited blogs 3d Vengeance Unlimited creator Vengeance Unlimited collectors Vengeance Unlimited online game
+
function Caller(x, y, block b) {
http://brontisbthimb.jugem.jp/?eid=5 buy movie Film Noir pda analysis of Film Noir Film Noir 3d ebay Film Noir wall stickers Film Noir remote control download Film Noir film Film Noir final free Film Noir chat Film Noir computer game Film Noir movie on internet dvd release date Film Noir Film Noir movie info Film Noir online review Film Noir patches Film Noir streaming watch full Film Noir movie now Film Noir score Film Noir blockbuster Film Noir actors list Film Noir it the movie hd Film Noir flaws Film Noir 3d showtimes Film Noir trial meaning of Film Noir Film Noir dialogues Film Noir ending Film Noir showing locations Film Noir vol original soundtrack Film Noir movie download share Film Noir free movie download buy movie Film Noir pda analysis of Film Noir Film Noir 3d ebay Film Noir wall stickers Film Noir remote control download Film Noir film Film Noir final free Film Noir chat Film Noir computer game Film Noir movie on internet dvd release date Film Noir Film Noir movie info Film Noir online review Film Noir patches Film Noir streaming watch full Film Noir movie now Film Noir score Film Noir blockbuster Film Noir actors list Film Noir it the movie hd Film Noir flaws Film Noir 3d showtimes Film Noir trial meaning of Film Noir Film Noir dialogues Film Noir ending Film Noir showing locations Film Noir vol original soundtrack Film Noir movie download share Film Noir free movie download
+
    return b(x, y);
http://dailybooth.com/rdentersjes/21852605 In Bar audiobook download In Bar movie cinema In Bar movie part virtual world In Bar In Bar film watch films psp In Bar when does the new In Bar come out watch In Bar streaming In Bar movie meaning In Bar online free trial In Bar free download movie In Bar wall stickers movie review for In Bar In Bar soundtrack youtube In Bar cheap virtual In Bar world In Bar collectors edition In Bar watch online megavideo In Bar suite sheet music In Bar playset In Bar and film buy In Bar it movie high quality In Bar first edition In Bar movie for download In Bar online com In Bar tops quotes of In Bar In Bar movie music whole film of In Bar where was In Bar filmed cheap In Bar movie i want to watch In Bar movie In Bar chess set full download In Bar movies voices of In Bar characters download In Bar film in hd quality In Bar portal In Bar lab In Bar audiobook download In Bar movie cinema In Bar movie part virtual world In Bar In Bar film watch films psp In Bar when does the new In Bar come out watch In Bar streaming In Bar movie meaning In Bar online free trial In Bar free download movie In Bar wall stickers movie review for In Bar In Bar soundtrack youtube In Bar cheap virtual In Bar world In Bar collectors edition In Bar watch online megavideo In Bar suite sheet music In Bar playset In Bar and film buy In Bar it movie high quality In Bar first edition In Bar movie for download In Bar online com In Bar tops quotes of In Bar In Bar movie music whole film of In Bar where was In Bar filmed cheap In Bar movie i want to watch In Bar movie In Bar chess set full download In Bar movies voices of In Bar characters download In Bar film in hd quality In Bar portal In Bar lab
+
}
http://dailybooth.com/rdentersjes/21852611 direct download Il deserto dei tartari movie sound track Il deserto dei tartari movies similar to Il deserto dei tartari Il deserto dei tartari oscar nominations Il deserto dei tartari online codes Il deserto dei tartari pictures of characters Il deserto dei tartari chapters Il deserto dei tartari download hd movies wiki Il deserto dei tartari film Il deserto dei tartari hdrip Il deserto dei tartari forums movie showtimes Il deserto dei tartari download Il deserto dei tartari movies online full Il deserto dei tartari film good quality watch Il deserto dei tartari full movie high quality Il deserto dei tartari official site rules Il deserto dei tartari Il deserto dei tartari chatting games Il deserto dei tartari generator how to download fast Il deserto dei tartari online download Il deserto dei tartari game review Il deserto dei tartari Il deserto dei tartari end Il deserto dei tartari fonts free Il deserto dei tartari online game Il deserto dei tartari soundtrack youtube Il deserto dei tartari game card Il deserto dei tartari mkv how to download Il deserto dei tartari movie Il deserto dei tartari mediafire download Il deserto dei tartari full movie high quality part length of Il deserto dei tartari movie Il deserto dei tartari stream Il deserto dei tartari flash game Il deserto dei tartari mediafire download links quality Il deserto dei tartari ipod Il deserto dei tartari hdtv watch the complete Il deserto dei tartari it movie watch Il deserto dei tartari film download watch Il deserto dei tartari film full version Il deserto dei tartari movie free Il deserto dei tartari matroska Il deserto dei tartari full lenght film in dvd format buy Il deserto dei tartari 3d quotes from the movie Il deserto dei tartari Il deserto dei tartari movies in order Il deserto dei tartari release cities direct download Il deserto dei tartari movie sound track Il deserto dei tartari movies similar to Il deserto dei tartari Il deserto dei tartari oscar nominations Il deserto dei tartari online codes Il deserto dei tartari pictures of characters Il deserto dei tartari chapters Il deserto dei tartari download hd movies wiki Il deserto dei tartari film Il deserto dei tartari hdrip Il deserto dei tartari forums movie showtimes Il deserto dei tartari download Il deserto dei tartari movies online full Il deserto dei tartari film good quality watch Il deserto dei tartari full movie high quality Il deserto dei tartari official site rules Il deserto dei tartari Il deserto dei tartari chatting games Il deserto dei tartari generator how to download fast Il deserto dei tartari online download Il deserto dei tartari game review Il deserto dei tartari Il deserto dei tartari end Il deserto dei tartari fonts free Il deserto dei tartari online game Il deserto dei tartari soundtrack youtube Il deserto dei tartari game card Il deserto dei tartari mkv how to download Il deserto dei tartari movie Il deserto dei tartari mediafire download Il deserto dei tartari full movie high quality part length of Il deserto dei tartari movie Il deserto dei tartari stream Il deserto dei tartari flash game Il deserto dei tartari mediafire download links quality Il deserto dei tartari ipod Il deserto dei tartari hdtv watch the complete Il deserto dei tartari it movie watch Il deserto dei tartari film download watch Il deserto dei tartari film full version Il deserto dei tartari movie free Il deserto dei tartari matroska Il deserto dei tartari full lenght film in dvd format buy Il deserto dei tartari 3d quotes from the movie Il deserto dei tartari Il deserto dei tartari movies in order Il deserto dei tartari release cities
+
</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++. В целом, у каждого языка есть свои преимущества и недостатки и в общем случае сравнивать их нельзя. Можно, разве что, судить о степени удобства языка, в сочетании с его производительностью и о том, насколько эффективно он позволяет решать задачи, на которые был рассчитан и исходя из которых проектировался.

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

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