Re[19]: Жизнь внутри метода
От: Sinclair Россия https://github.com/evilguest/
Дата: 14.11.08 07:30
Оценка:
Здравствуйте, VladD2, Вы писали:
VD>Опять пошла подмена понятий. Они не являются необходимыми чтобы порвав задницу хоть что-то изобразить. Но можно ли назвать программированием эмуляцию приводящую к ужасному нагромождению кода?
Я опять влезу со своим напоминанием про то, что все тьюринг-полные языки функционально эквивалентны. Что позволяет эмулировать что угодно на чем угодно.

Поэтому основное значение имеет количество кода, потребное для такой эмуляции. А также умение компилятора настучать по рукам, если эмуляция нарушает контракты.

Вот, к примеру, дотнет не даст создать делегат из метода, несовместимого по сигнатуре. Таким образом, среда и компилятор следят за тем, что за указатель я кладу в структурку. Я, конечно, могу эмулировать ровно то же хоть на C, хоть на asm, но любые ошибки будут отложены до рантайма.

А вот, к примеру, проследить, чтобы я не забыл сделать EndXXX() с IAsyncResult, полученным из BeginXXX(), компилятор C# пока не может. И это очень плохо, потому что чревато всякими занятными ошибками и утечками.
По идее, тот же Немерле мог бы делать что-то типа Рихтеровского AsyncEnumerator, только с человеческим лицом.

Ну то есть чтобы из синхронного кода типа такого:
WebRequest webRequest = WebRequest.Create(url);
WebResponse webResponse;
try
{
    webResponse = webRequest.GetResponse();
}
catch (WebException e)
{
    Console.WriteLine("Failed to contact server: {0}", e.Message);
    return;
}

using (webResponse)
{
    Stream webResponseStream = webResponse.GetResponseStream();
    ...
}

асинхронный получался не вот так:
WebRequest webRequest = WebRequest.Create(url);
webRequest.BeginGetResponse(ae.End(), null);
yield return 1;

WebResponse webResponse;
try
{
    webResponse = webRequest.EndGetResponse(ae.DequeueAsyncResult());
}
catch (WebException e) {
    Console.WriteLine("Failed to contact server: {0}", e.Message);
    yield break;
}

using (webResponse) {
    Stream webResponseStream = webResponse.GetResponseStream();
    ...
}

а как-то вот так:
WebRequest webRequest = WebRequest.Create(url);
WebResponse webResponse;
try
{
    webResponse = async webRequest.GetResponse();
}
catch (WebException e)
{
    Console.WriteLine("Failed to contact server: {0}", e.Message);
    return;
}

using (webResponse)
{
    Stream webResponseStream = webResponse.GetResponseStream();
    ...
}

И чтобы семантика, соответственно, совпадала с Рихтеровской. То есть вместо блокировки вызываюшего потока он возвращался бы в пул, а в момент окончания async из пула бы брался другой поток и начинал с того же места.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.