// даноclass Contents;
struct Size;
class Image;
class Icon {
.....
Image AsImage() const;
.....
};
class Controller {
.....
Icon GetIcon(Contents, Size) const;
.....
};
// хотел
Image image = controller.GetIcon(contents, size).AsImage();
// написал
Image image = controller.GetIcon(contents, size.AsImage());
И подумалось: а БЫЛО БЫ КРУТО просовывать пожелания ("AsImage" — это пожелание) изнутри наружу.
На перегрузках и шаблонах это делается несложно, хотя и многословно, если нет соответствующего фреймворка или поддержки языка
class Controller {
.....
template<class Wish>
auto GetIcon(Contents contents, Size size, Wish wish) -> auto {
return apply_wish(GetIcon(contents, size), wish);
}
.....
};
Image image = controller.GetIcon(contents, size, AsImage);
Следующим шагом будет свёртка пожеланий с аргументами (что у меня и произошло в опечатке) — и дальнейший вывод пожелания из типа аргумента.
class Controller {
.....
template<class Size_Wish>
auto GetIcon(Contents contents, Size_Wish size) -> auto {
return apply_wish(GetIcon(contents, get_pure(size)), get_wish(size));
}
.....
};
Image image = controller.GetIcon(contents, make_wish(size, AsImage));
Ну и наконец, легитимизация синтаксиса: make_wish(x,y) == x.y
Здравствуйте, _NN_, Вы писали:
_NN>Дык даешь на полную катушку. _NN>Ну и далее << , >>= , <<= по вкусу и можно для простых лямбд
Конвееры нафигачить — дело нехитрое. Я-то говорю про то, чтобы лифтить функции...
(servile foo) (x `wishing` bar) == bar (foo x)
Вот такой тернарный оператор, понимаешь! И обобщить его на цепочки функций и цепочки аргументов. Примерно так же, как монады и аппликативные функторы. Только навыворот. В общем, тут покумекать требуется.
К>// хотел К>Image image = controller.GetIcon(contents, size).AsImage(); К>// написал К>Image image = controller.GetIcon(contents, size.AsImage()); К>[/c]
К>И подумалось: а БЫЛО БЫ КРУТО просовывать пожелания ("AsImage" — это пожелание) изнутри наружу.
Так и не понял, что это будет за семантика, и чем этот синтаксис лучше оригинального.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали:
К>>И подумалось: а БЫЛО БЫ КРУТО просовывать пожелания ("AsImage" — это пожелание) изнутри наружу. S>Так и не понял, что это будет за семантика, и чем этот синтаксис лучше оригинального.
Фактически, это contiunation и, похоже, монада writer.
Чем это лучше? Тем, что пожелания можно не только накладывать снаружи на формулу (как я хотел, но опечатался),
-- пользовательские функции
f :: X -> Y
postprocess :: Y -> Z
x :: X
z :: Z
z = run_wish( lift(f) (x `with_wish` postprocess) )
-- эквивалентно (только очень громоздко)
z = postprocess(f(x))
но и возвращать вовне, и пусть вызывающая сторона выполнит пожелание там и тогда, где и когда сочтёт нужным.
Скажем, в рамках типа пожелания "AsImage" могут быть значения "asTransparentImage", "asSolidImage", "asMockImage"
Здравствуйте, Кодт, Вы писали:
К>А можно без этих игроманских идиом? Ниччего не понял, кроме того, что наезжаешь.
Это шутка была, а не наезд. В игровой системе DND есть такой скилл, теоретически неограниченный, но расплачиваешься за него старением или потерей опыта, в зависимости от системы. Ну и в довесок, жадные желания искажаются ДМовским произволом.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Здравствуйте, Ops, Вы писали:
Ops>Это шутка была, а не наезд. В игровой системе DND есть такой скилл, теоретически неограниченный, но расплачиваешься за него старением или потерей опыта, в зависимости от системы. Ну и в довесок, жадные желания искажаются ДМовским произволом.
Старение в обмен на желание? Старина Оноре, Шагреневая кожа...