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

Материал из Deeptown Manual
Перейти к: навигация, поиск
(http://esisoc.over-blog.com/article-small-soldiers-1998-online-download-95870716.html best Small Soldiers game Small Soldiers watch http://www.ign.com/blogs/litedvolo/2011/12/31/how-to-watch-the-full)
(http://skyltenga.jugem.jp/?eid=7 rent Witch Hunt online fast Witch Hunt movie screenshots http://maharray.blogg.se/2011/december/download-planzet-2010-full-lenght.html new movie Planzet Planzet hd h)
Строка 58: Строка 58:
 
Mesto vstrechi izmenit nelzya dvd release http://bakrepanc.blogg.se/2012/january/download-mesto-vstrechi-izmenit-nelzya-1979.html movies like Mesto vstrechi izmenit nelzya
 
Mesto vstrechi izmenit nelzya dvd release http://bakrepanc.blogg.se/2012/january/download-mesto-vstrechi-izmenit-nelzya-1979.html movies like Mesto vstrechi izmenit nelzya
  
== Встроенные блоки ==
+
http://skyltenga.jugem.jp/?eid=7 rent Witch Hunt online fast Witch Hunt movie screenshots
 
+
http://maharray.blogg.se/2011/december/download-planzet-2010-full-lenght.html new movie Planzet Planzet hd
Чаще всего, блоки применяются для записи небольших кусочков кода, которые, как в примерах выше, передаются в функции, для уточнения некоторых моментов. Для того чтобы облегчить работу программиста и сделать код более читаемым, был введен специальный синтаксис для передачи блоков в функции с одновременным их объявлением "на месте"; при этом, блоки записываются в сокращенной форме сразу за кодом вызова функции, после блока фактических параметров.
+
hd dvd House of Whipcord http://umalin.jugem.jp/?eid=2 House of Whipcord game sequel
 
+
Jackpot bluray 1080p download mediafire http://skyltenga.jugem.jp/?eid=8 Jackpot games online for free
Покажем использование встроенных блоков на примере нахождения суммы чисел от 1 до 10, а так же получения списка четных чисел в этом же интервале.
+
watch the full movie of Kid vs Kat online http://maharray.blogg.se/2011/december/fast-kid-vs-kat-2008-tv-series-download-ful.html Kid vs Kat film wikipedia
<source lang="kpp">
+
The First Turn-On theater locations http://umalin.jugem.jp/?eid=3 play The First Turn-On online
var s = 0;
+
The Ghost Busters new song http://maharray.blogg.se/2011/december/the-ghost-busters-1975-tv-series-new-movie.html trailer The Ghost Busters
var numbers = [];
+
downloadable America the Beautiful film http://umalin.jugem.jp/?eid=4 explaining America the Beautiful
(1..10).each() { |x| s += x; numbers.push(x); };
+
whole Lovesick: Sick Love film http://umalin.jugem.jp/?eid=5 Lovesick: Sick Love free online movie
var evens = numbers.collect() { |x| x % 2 == 0 ? x : null; }.compact();
+
http://maharray.blogg.se/2011/december/were-can-i-download-ubiytsy-1956-short-film.html ringtones Ubiytsy list of songs in Ubiytsy
</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++. В целом, у каждого языка есть свои преимущества и недостатки и в общем случае сравнивать их нельзя. Можно, разве что, судить о степени удобства языка, в сочетании с его производительностью и о том, насколько эффективно он позволяет решать задачи, на которые был рассчитан и исходя из которых проектировался.
+

Версия 00:15, 3 января 2012


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

Случается, что в работе некоторого алгоритма возникают четко определенные функциональные подсистемы, которые, однако, слишком зависимы от самого алгоритма, либо слишком просты для того, чтобы выделять их в отдельную функцию. В случае с 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>

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

XeNnsN <a href="http://aqfplfwlrdip.com/">aqfplfwlrdip</a>, [url=http://ejycmszseqro.com/]ejycmszseqro[/url], [link=http://cccsigzuayoi.com/]cccsigzuayoi[/link], http://bilcsnigisim.com/

http://maharray.blogg.se/2011/december/les-anges-du-peche-1943-movie-downloads.html Les anges du peche pride Les anges du peche fan fiction Nightmare Castle images http://maharray.blogg.se/2011/december/watch-nightmare-castle-1965-film-high-quali.html Nightmare Castle labs http://diaphopa.jugem.jp/?eid=5 Words of Devotion download full film watch Words of Devotion volume http://maharray.blogg.se/2011/december/cheap-chance-2009-film.html Chance film series best quality Chance film Manchild actor list http://maharray.blogg.se/2011/december/the-movie-manchild-2002-tv-series.html Manchild fan characters Kickboxing Academy http://diaphopa.jugem.jp/?eid=6 free Kickboxing Academy game download Screw Loose movie in theaters http://maharray.blogg.se/2011/december/watch-screw-loose-1999-movies-online.html names of Screw Loose http://maharray.blogg.se/2011/december/where-can-i-buy-back-to-the-planet-of-the-ape.html director Back to the Planet of the Apes Back to the Planet of the Apes audiobooks http://diaphopa.jugem.jp/?eid=7 Dr ending extended Dr two towers Cruel Passion 3d version http://maharray.blogg.se/2011/december/cruel-passion-1977-film-to-watch-now.html Cruel Passion original http://umalin.jugem.jp/?eid=1 The Queen of Hearts length The Queen of Hearts movie characters

http://esisoc.over-blog.com/article-small-soldiers-1998-online-download-95870716.html best Small Soldiers game Small Soldiers watch http://www.ign.com/blogs/litedvolo/2011/12/31/how-to-watch-the-full-film-of-jackass-the-movie-2002-documentary/ Jackass: The Movie games watch Jackass: The Movie movie online http://bilibeg.jugem.jp/?eid=1 High School Musical 3: Senior Year group High School Musical 3: Senior Year film to watch now Balls of Fury full film online http://bilibeg.jugem.jp/?eid=2 Balls of Fury filestube http://bilibeg.jugem.jp/?eid=3 Runaway Jury tracksuit Runaway Jury rating Certified Copy music director http://dailybooth.com/myonido270/21851341 tickets to Certified Copy http://dailybooth.com/myonido270/21851345 buy Blind Justice suit download Blind Justice trilogy http://dailybooth.com/myonido270/21851348 Veda - Ataturk song mp3 song at the end of Veda - Ataturk Murders in the Rue Morgue movie price http://dailybooth.com/myonido270/21851369 i want to watch the full film of Murders in the Rue Morgue online http://dailybooth.com/myonido270/21851382 watch The Game of Their Lives full movie online your own The Game of Their Lives http://dailybooth.com/myonido270/21851393 pre order Unseen Evil 2 tickets animated Unseen Evil 2 http://bilibeg.jugem.jp/?eid=4 Boarding School online promotional code 3d Boarding School games picture of Summer City http://bilibeg.jugem.jp/?eid=5 Summer City release dvd Silver Surfer movie posters http://dailybooth.com/myonido270/21851423 last Silver Surfer movie http://bilibeg.jugem.jp/?eid=6 new york The Naked Trucker and T-Bones Show download The Naked Trucker and T-Bones Show online http://slimserritha.eklablog.com/buy-the-film-ugly-me-2006-a29166298 Ugly Me dvd price Ugly Me release date dvd http://bilibeg.jugem.jp/?eid=7 movie quality The Freshman The Freshman playing near me Sharpe s Revenge suit for sale http://slimserritha.eklablog.com/sharpe-s-revenge-1997-tv-movie-film-website-a29166344 remote control Sharpe s Revenge Mesto vstrechi izmenit nelzya dvd release http://bakrepanc.blogg.se/2012/january/download-mesto-vstrechi-izmenit-nelzya-1979.html movies like Mesto vstrechi izmenit nelzya

http://skyltenga.jugem.jp/?eid=7 rent Witch Hunt online fast Witch Hunt movie screenshots http://maharray.blogg.se/2011/december/download-planzet-2010-full-lenght.html new movie Planzet Planzet hd hd dvd House of Whipcord http://umalin.jugem.jp/?eid=2 House of Whipcord game sequel Jackpot bluray 1080p download mediafire http://skyltenga.jugem.jp/?eid=8 Jackpot games online for free watch the full movie of Kid vs Kat online http://maharray.blogg.se/2011/december/fast-kid-vs-kat-2008-tv-series-download-ful.html Kid vs Kat film wikipedia The First Turn-On theater locations http://umalin.jugem.jp/?eid=3 play The First Turn-On online The Ghost Busters new song http://maharray.blogg.se/2011/december/the-ghost-busters-1975-tv-series-new-movie.html trailer The Ghost Busters downloadable America the Beautiful film http://umalin.jugem.jp/?eid=4 explaining America the Beautiful whole Lovesick: Sick Love film http://umalin.jugem.jp/?eid=5 Lovesick: Sick Love free online movie http://maharray.blogg.se/2011/december/were-can-i-download-ubiytsy-1956-short-film.html ringtones Ubiytsy list of songs in Ubiytsy

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

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