| |||
|
|
Для чего нужны замыкания: proc compose = ((real) real f, (real) real g) (real) real: (real x) real: f (g (x)) при попытке написать что-то вроде compose (sin, cos) (3.1415) вывалится с segfault. Ну или может не вывалится - если стек затереться не успеет. Но то полбеды - а началось это с рассуждения о том, что Если контекст замыкания - не переменные, то в чем вообще сакральный смысл замыкания и чем оно отличается от дополнительных (скрытых) параметров? (там впрочем поперло уже вовсе смешное - в духе "а мы сами знаем что на ассмеблере писать плохо - мы все в кодах пишем") Так вот - замыкания (АКА closures) нужны чтобы это работало: # include <functional> # include <iostream> # include <math.h> using namespace std; template <typename T> function<T (T)> compose (function<T (T)> f, function<T (T)> g) { return [=](T x) { return f (g (x)); }; } int main () { cout << "sin (cos (2*pi)=" << compose<double> (sin, cos) (2*3.1415) << "\n"; return 0; } А вот кстати для такого: template <typename T> void scan (T a [], int const len, function<void (T)> f) { for (int i = 0; i != len; ++ i) f (a [i]); } int main () { double n [] = { 1, 2, 3, 4, 5 }; double res = 0; scan<double> (n, sizeof (n)/sizeof (*n), [&res](double x) { res += x*x; }); cout << res << "\n"; return 0; } Замыкания как раз ни на фиг не нужны - привет pargentum@lj с его "ужастными переменными" - это прекрасно работало и в А-60 и в Паскале (только не "турбо") и много где еще - включая старые версии gcc - без всяких замыканий - тут как раз вполне достаточно поддержки динамической цепочки вызовов. |
||||||||||||||||