Как стать автором
Обновить
99
0
Рысцов Денис @shai_xylyd

Пользователь

Отправить сообщение
Так, первый пример это работающий код на Ruby или превдокод?
Нет, я написал по комбинацию асинхронных методов (метод асинхронный, если он возвращает не результат, а фьючерс).

Писать 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. Таким образом порождается новая асинхронная задача. Как-то так.

P.S. Я об этом уже писал на хабре habrahabr.ru/blogs/net/107498/
Это не то, более слабое средство. Только что посмотрел, что такое em-easy и оказалось, что это просто фьючерсы, а async/await в C# — монада, средство комбинировать асинхронные задачи.
Для таких случаев правильно средство использовать внешние генераторы парсеров, или языки, которые их поддерживают. Например, в Nemerle генерация парсера по грамматике реализована как библиотека макросов и находиться в такой же шаговой доступности, как и регулярные выражения.
Думаю, они это знают. Реализовать разбор на регулярных выражениях сделать нельзя, так как языки программирования не являются регулярными=) Можно их использовать на этапе лексического анализа, но вся логика разбора будет уровнем выше. Для этих целей лучше использовать полноценные парсеры.
Если комментарий вложен в cdata, то логика его обработки должна измениться, и наоборот. И это только xml, а языках программирования намного больше специфики, например, в C# подсветка from, select зависит от контекста.
С поддержкой cdata и комментариев?
С помощью регулярных выражений нельзя разобрать исходный код и обеспечить корректную подсветку.
Не, можно без Task, правда тогда контроль над вычислением теряется.
Дмитрий, может немного написать, как ты используешь 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) и проблем совместимости не было.
Они его уже разбирают, нужно в async CTP смотреть на пространство имен System.Threading.Tasks.Dataflow.
В чем были проблемы с mono?
Ага, там левая и правая вилка оказывается одинаковой, и философ сам себя блокирует =)
Не читал, но может лицензия вирусная?
Радикально .net framwork менялся только при смене версий с 1 на 2.
Monitor — часть BCL, а WPF — нет (является нестандартной частью .net framework).

Информация

В рейтинге
Не участвует
Откуда
Санкт-Петербург, Санкт-Петербург и область, Россия
Дата рождения
Зарегистрирован
Активность