Нет, я написал по комбинацию асинхронных методов (метод асинхронный, если он возвращает не результат, а фьючерс).
Писать await нужно, чтобы показать компилятору, где применять магию=)
Фьючерсами описать комбинацию асинхронных методов в асинхронный метод нельзя, поэтому то, что реализовано в ruby не аналогично тому, что будет в C# и есть в F#, Nemerle, Haskell.
Да, но в момент, когда происходит вызов wait поток выполнения блокируется, в случае await создается новая асинхронная задача и выполнение не блокируется, а результатом await является задача. await это монада, она позволяет комбинировать и создавать новые асинхронные задачи.
Пример, пусть есть два метода f() и g(), которые работают асинхронно и возвращают числа, задача создать новый метод h(), который работает асинхронно и складывает результаты вычислений f() и g(), вот решение на C#:
async Task<int> h()
{
var x = f();
var y = g();
return (await x) + (await y);
}
Повторяю вызов h() запустит вычисление асинхронно и тут же вернет управление.
Как такое выразить в Ruby?
Если нам уже нужен сам результат, то у объекта типа Task обратимся к свойству Result, это эквивалентно wait в ruby.
У объекта представляющую асинхронную задачу есть метод, который принимает на вход функцию. Смысл этого этого метода — как только асинхронное вычисление закончиться применить к результату данную функцию; понятно, что вызов этого метода неблокирующий, а возвращает он объект представляющий новую асинхронную задачу, комбинацию старой и новой.
Оператор await берет весь код, который следует за ним (переписывает весь код метода) и передает его как функцию в тот метод аргумента await. Таким образом порождается новая асинхронная задача. Как-то так.
Это не то, более слабое средство. Только что посмотрел, что такое em-easy и оказалось, что это просто фьючерсы, а async/await в C# — монада, средство комбинировать асинхронные задачи.
Для таких случаев правильно средство использовать внешние генераторы парсеров, или языки, которые их поддерживают. Например, в Nemerle генерация парсера по грамматике реализована как библиотека макросов и находиться в такой же шаговой доступности, как и регулярные выражения.
Думаю, они это знают. Реализовать разбор на регулярных выражениях сделать нельзя, так как языки программирования не являются регулярными=) Можно их использовать на этапе лексического анализа, но вся логика разбора будет уровнем выше. Для этих целей лучше использовать полноценные парсеры.
Если комментарий вложен в cdata, то логика его обработки должна измениться, и наоборот. И это только xml, а языках программирования намного больше специфики, например, в C# подсветка from, select зависит от контекста.
Дмитрий, может немного написать, как ты используешь Rx, я понимаю примение TPL Dataflow, но Rx — нет, мне кажеться, что она больше ориентирована на gui приложения, это так?
Наверное иметь caas, но не иметь aop, значит, что в процесс компиляции не будет хуков, которые позволят модефицировать ast. Иначе бы на PDC показали бы более вкусные примеры.
Скорее всего, caas разрабатывается, чтобы упростить разработку плагинов для студии.
Когда я в последний раз смотрел на caas в mono, он так же позволял подключить себя как библиотеку, но не подключиться к процессу компиляции.
Нет, ну это не серьезно, я думал у вас много опыта и ожидал рассказ об «особенностях» работы mono с asp, основываясь на этом высказывании:
… весь веб только под винду, и не надо мне про моно говорить, пробовали, все не то
а оказалось, что это было давно не правда. У самого home pet проект (uniquation) разрабаьывается под windows, деплоиться под mono, в том числе используется asp.net mvc 2 (galois/wiki) и проблем совместимости не было.
Писать await нужно, чтобы показать компилятору, где применять магию=)
Фьючерсами описать комбинацию асинхронных методов в асинхронный метод нельзя, поэтому то, что реализовано в ruby не аналогично тому, что будет в C# и есть в F#, Nemerle, Haskell.
Пример, пусть есть два метода f() и g(), которые работают асинхронно и возвращают числа, задача создать новый метод h(), который работает асинхронно и складывает результаты вычислений f() и g(), вот решение на C#:
Повторяю вызов h() запустит вычисление асинхронно и тут же вернет управление.
Как такое выразить в Ruby?
Если нам уже нужен сам результат, то у объекта типа Task обратимся к свойству Result, это эквивалентно wait в ruby.
Оператор await берет весь код, который следует за ним (переписывает весь код метода) и передает его как функцию в тот метод аргумента await. Таким образом порождается новая асинхронная задача. Как-то так.
P.S. Я об этом уже писал на хабре habrahabr.ru/blogs/net/107498/
Наверное иметь caas, но не иметь aop, значит, что в процесс компиляции не будет хуков, которые позволят модефицировать ast. Иначе бы на PDC показали бы более вкусные примеры.
Скорее всего, caas разрабатывается, чтобы упростить разработку плагинов для студии.
Когда я в последний раз смотрел на caas в mono, он так же позволял подключить себя как библиотеку, но не подключиться к процессу компиляции.
а оказалось, что это было давно не правда. У самого home pet проект (uniquation) разрабаьывается под windows, деплоиться под mono, в том числе используется asp.net mvc 2 (galois/wiki) и проблем совместимости не было.