Здравствуйте, alex_public, Вы писали:
_>Здравствуйте, Ikemefula, Вы писали:
I>>Ты же ни решения, ни набросков не показал
_>Ээээ что? )Я тебе показал как преобразовать коллбэк в асинхронный вызов (и на C++ и на D одинаково) и как организовать цепочку таких вызовов (красиво на D и чуть пострашнее на C++). Причём всё это в виде шаблонов, так что пишется один раз и закидывается в библиотеку. Чего тебе ещё не хватает то? )
Ты не показал самого главного — как оформить нужный апи. Вместо этого ты показал, что будет унутре.
не надо объяснять, что унутре будет аналог промисов. Покажи как именно будет сделан апи. Что там унутре, было понятно и до твоих объяснений.
Re[2]: Язык D - действительно красота и эффективность в одном флаконе
Здравствуйте, D. Mon, Вы писали:
DM>Здравствуйте, ivanzoid, Вы писали:
I>>Ребята, не то вы обсуждаете. I>>Из новых языков, I>>Github repositories, stars > 10: I>>D I>>Rust I>>Go
DM>Так и PHP популярней хаскеля. Но на этом Вне сам пиши.
Кстати. Правильно ли я понял, что вы утверджаете, что Хаскель лучше чем PHP?)
Re[38]: Язык D - действительно красота и эффективность в одном ф
Здравствуйте, Ikemefula, Вы писали:
I>Ты не показал самого главного — как оформить нужный апи. Вместо этого ты показал, что будет унутре.
I>не надо объяснять, что унутре будет аналог промисов. Покажи как именно будет сделан апи. Что там унутре, было понятно и до твоих объяснений.
Ааа, ну ОК. Хотя мне казалось это гораздо более очевидно, чем внутренняя структура.
И так, в твоей задачке у нас "задан свыше" некий асинхронный api (сомнительная вещь на самом деле, ну да ладно). Зафиксируем его в виде тестового C++ кода:
struct ZR{
string value;
};
struct YR{
double value;
void z(function<void(ZR&)> success, function<void(int)> error);
//внутри может быть например thread([]{s(ZR{to_string(value)};}).detach();
};
struct XR{
int value;
void y(function<void(YR&)> success, function<void(int)> error);
//внутри может быть например thread([]{s(YR{value/10.0};}).detach();
};
void x(function<void(XR&)> success, function<void(int)> error);
//внутри может быть например thread([]{s(XR{42};}).detach();
И нам соответственно надо получить результат вычисления цепочки этих асинхронных вызовов. Для этого подключаем один маленький библиотечный (т.е. ничего не знающий про x, y, z) hpp файл и тогда можем написать например так:
auto f=async()|x|&XR::y|&YR::z;
//тут спокойно занимаемся другими делами, а f вычисляется где-то в других потоках
cout<<f.get().value<<endl;
Конечно код не особо красивый, но на C++ у нас маловато инструментов для украшательств. А вот на D без проблем можно получить при аналогичном раскладе такой код:
auto f=async().x().y().z();
//тут спокойно занимаемся другими делами, а f вычисляется где-то в других потоках
writeln(f.get().value);
Re[4]: Язык D - действительно красота и эффективность в одном флаконе
Здравствуйте, alex_public, Вы писали:
>Ааа, ну ОК. Хотя мне казалось это гораздо более очевидно, чем внутренняя структура.
_>И так, в твоей задачке у нас "задан свыше" некий асинхронный api (сомнительная вещь на самом деле, ну да ладно). Зафиксируем его в виде тестового C++ кода: _>
_>auto f=async().x().y().z();
_>
Вот этот async как сделан ?
Re[5]: Язык D - действительно красота и эффективность в одном флаконе
Здравствуйте, D. Mon, Вы писали:
DM>Здравствуйте, ivanzoid, Вы писали:
I>>Кстати. Правильно ли я понял, что вы утверджаете, что Хаскель лучше чем PHP?)
DM>Зависит от того, как понимать "лучше". В первом языке есть дизайн, логика, красота, безопасность и эффективность, во втором ничего этого нет.
Но позвольте с вами поспорить. Я вообще сам конечно не очень люблю PHP, но этот язык заставляет себя уважать. На PHP работает Фэйсбук и ВКонтакте (оставим в стороне эмоциональную оценку их пользователей и примем во внимание только технический масштаб проектов). Что работает на хаскеле?
Re[40]: Язык D - действительно красота и эффективность в одном ф
Здравствуйте, ivanzoid, Вы писали:
I>Но позвольте с вами поспорить. Я вообще сам конечно не очень люблю PHP, но этот язык заставляет себя уважать. На PHP работает Фэйсбук и ВКонтакте (оставим в стороне эмоциональную оценку их пользователей и примем во внимание только технический масштаб проектов).
Тут следует заметить, что:
1) эти проекты использовали РНР не потому, что сам язык чем-то хорош, а лишь поскольку первоначальные авторы его знали, и он был популярен. Популярность — это важное свойство языка, но оно все же внешнее, нетехническое и неимманентное.
2) И Фейсбук и ВКонтакте по сути отказались от самого РНР и сконструлили свои варианты, лишь отчасти пересекающиеся с РНР и то лишь по историческим причинам (чтобы не все переписывать). Фейсбук сейчас работает на Hack'e, который сам написан на Окамле. При этом некоторые части Фейсбука таки сделаны на хаскеле. ВКонтакте запили свой транслятор в С++: https://github.com/vk-com/kphp-kdb/
I>Что работает на хаскеле?
Например, такой RSS-ридер, замена почившему Google Reader'у: https://bazqux.com/
Плюс некоторые банки его активно используют, http://www.haskell.org/haskellwiki/Haskell_in_industry
плюс всякий десктопный софт на нем делается (оконный менеджер xmonad, конверторы вроде Pandoc, архиватор FreeArc, компиляторы...).
Re[42]: Язык D - действительно красота и эффективность в одном ф
Так мы же передаём эту функцию (или указатель на глобальный метод/функцию-член в C++ или вообще как строку с именем метода в D) как параметр к перегруженному оператору (| в C++ или . в D) future.
I>2 для структур XR, YR должен быть переопределен оператор (), кто его будет переопределять ?
Ээээ что? ) Перегрузки оператора () нет ни в C++ ни в D варианте.
Re[43]: Язык D - действительно красота и эффективность в одном ф
I>>Как это делается ?
_>Так мы же передаём эту функцию (или указатель на глобальный метод/функцию-член в C++ или вообще как строку с именем метода в D) как параметр к перегруженному оператору (| в C++ или . в D) future.
Непонятно
я пишу async(), и это вдруг значит, что my_future<void>(), который унутре либы и про x ничего не знает должен узнать, что x можно вызывать вот вот.
Как узнать, что теперь у этого объекта можно вызвать метод, про который объет не знает ?
если my_future<void>() генерируется текстом, то все понятно. А вот если генерации нет, то непонятно.
I>>2 для структур XR, YR должен быть переопределен оператор (), кто его будет переопределять ?
_>Ээээ что? ) Перегрузки оператора () нет ни в C++ ни в D варианте.
Не важно. Объясни подробно, как будет работать связывание.
Re[44]: Язык D - действительно красота и эффективность в одном ф
Здравствуйте, Ikemefula, Вы писали:
I>Непонятно
I>я пишу async(), и это вдруг значит, что my_future<void>(), который унутре либы и про x ничего не знает должен узнать, что x можно вызывать вот вот.
I>Как узнать, что теперь у этого объекта можно вызвать метод, про который объет не знает ?
I>если my_future<void>() генерируется текстом, то все понятно. А вот если генерации нет, то непонятно.
Так "my_future<void> f0;" и не умеет ничего. А вот my_future<XR> f1=f0|x; уже всё знает про x и про ХR. Конечно это не изящное решение, но большего в C++ что-то с ходу не придумывается. А вот в D, в котором есть перегрузка оператора ".", которая выглядит как шаблонная функция с параметром string'ом содержащим имя вызываемого метода, можно сделать красивый код вида my_future!void f0; my_future!XR f1=f0.x();
Re[45]: Язык D - действительно красота и эффективность в одном ф
Здравствуйте, alex_public, Вы писали:
_>Здравствуйте, Ikemefula, Вы писали:
I>>Непонятно
>А вот в D, в котором есть перегрузка оператора ".", которая выглядит как шаблонная функция с параметром string'ом содержащим имя вызываемого метода, можно сделать красивый код вида my_future!void f0; my_future!XR f1=f0.x();
Ну вот, т.е. ты имел ввиду opDispatch, правильно ?
Re[46]: Язык D - действительно красота и эффективность в одном ф
Здравствуйте, alex_public, Вы писали:
I>>Ну вот, т.е. ты имел ввиду opDispatch, правильно ?
_>Конечно. А внутри него then на соответствующий mixin и всё.
А без async() сможешь ?
Re[48]: Язык D - действительно красота и эффективность в одном ф
Здравствуйте, Ikemefula, Вы писали:
I>А без async() сможешь ?
Это в смысле чтобы был x().y().z() без какой-либо сущности слева, в начале цепочки? Боюсь такое без дополнительной подготовки (типа какого-нибудь макроса предварительно вызванного для х и автоматом создающего нужную x без параметров) уже не получится...