User Tools

Site Tools

A PCRE internal error occured. This might be caused by a faulty plugin

cs315:closure_sample

====== Closure examples in Python and C++11 ====== In Python: <sxh 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] </sxh> The same in C++11: <sxh cpp> #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; } </sxh>

cs315/closure_sample.txt · Last modified: 2017/02/06 03:43 (external edit)

Page Tools