Блоки итераторов, часть Седьмая: Почему нет анонимных итераторов?

Эта аннотация к комментарию к пятой части, по моему мнению, заслуживает повышения до самостоятельной статьи. Почему мы не разрешаем анонимные итераторы? Я был бы счастлив иметь анонимные блоки итераторов. Я хочу писать что-то вроде: IEnumerable<int> twoints = ()=>{ yield return x; yield return x*10; }; foreach(int i in twoints) … Было бы вообще офигенно уметь…


Блоки итераторов, Часть шестая: почему запрещён небезопасный код?

Есть три хороших причины не разрешать блоки unsafe в блоках итераторов. Во-первых, это весьма маловероятный сценарий. Цель блоков итераторов – в облегчении написания итератора, который обходит некоторый абстрактный тип данных. Это, скорее всего, будет полностью управляемый код; так что сценарий не входит в проект. Во-вторых, этот сценарий представляет дикое смешение «уровней». Вы трактуете уровень абстракции…


Блоки итераторов, часть пятая: Активный или Пассивный

Некоторое время назад я опубликовал комментарий по поводу Летних Игр по Скриптингу, где я отметил наличие изоморфизма между «пассивными» коллекциями, , и «активными» событиями. Обычно вы думаете про события, как про что-то, что «вызывает» вас, отдавая вам аргументы событий. А о коллекциях вы думаете как о чём-то таком, из чего вы «вытаскиваете» данные, запрашивая следующее…


Блоки итераторов, Часть четвёртая: Почему нет yield в блоках catch?

Теперь, когда вы знаете, почему мы не разрешаем yield в finally, легко увидеть, почему мы также запрещаем yield в catch. Во-первых, у нас всё еще есть проблема – запрещено делать goto в середину обработчика региона, защищённого try. Единственный способ войти в блок catch – это «нелокальный переход», то есть отлов исключения. Так что, стоило вам…


Блоки итераторов, Часть третья: почему нет yield в блоке finally?

Есть три сценария, в которых код блока итератора может исполняться в finally. Ни в одном из них возврат значения изнутри finally не является хорошей идеей, так что это полностью запрещено. Эти три сценария – (1) обычная очистка ресурсов, (2) очистка ресурсов при возникновении исключения, и (3) разрушение итератора. Для первого сценария, предположим, что у нас…


Блоки итераторов, Часть вторая: Почему нет out- или ref- параметров?

Долгое и подробное обсуждение того, как именно мы реализовали блоки итераторов отняло бы довольно много моего времени, и продублировало бы работу, уже хорошо выполненную другими. Я призываю вас начать с плавного введения – цикла статей Реймонда: часть 1, часть 2, часть 3. Если вы хотите подробнее рассмотреть, как готовят эти сосиски, то статья Джона весьма…


Блоки итераторов, Часть первая

В дизайне языков программирования есть постоянное трение между решением общих проблем и решением частных проблем; поиск верной точки в спектре от-общего-к-частному может быть весьма нетривиальным. Дизайн блоков итераторов даёт* нам характерный пример. Почти при каждом шаге на его пути есть возможность принять решение, которое определит, будет ли решаться более общая или более частная проблема. Давайте…


Итераторы на Летних Играх

Ed “Scripting Guy” Wilson был столь любезен, что попросил меня быть приглашенным комментатором на Летних Играх по Скриптингу этого года, которые только что завершились. Я работал над серией постов для этого блога про некоторые необычные случаи в дизайне «блока итератора» в C# 2.0; этот фрагмент из моих комментариев непосредственно к этой серии относится. Сериал про…