Examples using closures in Python:
#!/usr/bin/env python
def make_adder(x):
def adder(y):
return x+y
return adder
add3 = make_adder(3);
print add3(5) # 8
def make_appender(post_list):
def appender(pre_list):
pre_list.extend(post_list)
return appender
X = [4, 5]
Y = [1, 2]
Z = [1, 2]
appendX = make_appender(X)
appendX(Y)
print Y # [1, 2, 4, 5]
X.insert(0, 3) # insert 3 to front
appendX(Z)
print Z # [1, 2, 3, 4, 5]
import copy
def make_appender2(post_list):
post_list_copy = copy.deepcopy(post_list)
def appender(pre_list):
return pre_list.extend(post_list_copy)
return appender
X = [4, 5]
Y = [1, 2]
Z = [1, 2]
appendX = make_appender2(X)
appendX(Y)
print Y # [1, 2, 4, 5]
X.insert(0, 3) # insert 3 to front
appendX(Z)
print Z # [1, 2, 4, 5]
The same in C++11:
#include <cstdlib>
#include <iostream>
#include <functional>
#include <vector>
using namespace std;
template <class T>
function<T (T const &)> make_adder(T const & x)
{
auto adder = [=] (T const & y)
{
return x + y;
};
return adder;
}
template <class T>
function<void (vector<T> &)> make_appender(vector<T> const & post_list)
{
auto appender = [&] (vector<T> & pre_list)
{
pre_list.insert(pre_list.end(), post_list.begin(), post_list.end());
};
return appender;
}
template <class T>
function<void (vector<T> &)> make_appender2(vector<T> const & post_list)
{
auto appender = [=] (vector<T> & pre_list)
{
pre_list.insert(pre_list.end(), post_list.begin(), post_list.end());
};
return appender;
}
// helper for printing vectors
template <class T>
ostream & operator<<(ostream & ostr, vector<T> const & vec)
{
ostr << "{";
if (!vec.empty()) {
auto it = vec.begin();
ostr << *(it++);
for (; it!=vec.end(); ++it)
ostr << "," << *it;
}
ostr << "}";
return ostr;
}
int main()
{
{
auto add3 = make_adder(3);
cerr << add3(5) << endl; // 8
}
{
vector<int> X = {4, 5};
vector<int> Y = {1, 2};
vector<int> Z = {1, 2};
auto appendX = make_appender(X);
appendX(Y);
cerr << Y << endl; // {1, 2, 4, 5}
X.insert(X.begin(), 3); // insert 3 to front
appendX(Z);
cerr << Z << endl; // {1, 2, 3, 4, 5}
}
{
vector<int> X = {4, 5};
vector<int> Y = {1, 2};
vector<int> Z = {1, 2};
auto appendX = make_appender2(X);
appendX(Y);
cerr << Y << endl; // {1, 2, 4, 5}
X.insert(X.begin(), 3); // insert 3 to front
appendX(Z);
cerr << Z << endl; // {1, 2, 4, 5}
}
return EXIT_SUCCESS;
}