2013-02-25 79 views
6

क्या लम्बाडा/फीनिक्स को लम्बाडा जैसे बॉक्स से बाहर समर्थन करता है जो एक और लैम्ब्डा देता है?बूस्ट लैम्ब्डा/फीनिक्स - लैम्ब्डा कैसे करें जो एक और लैम्ब्डा लौटाता है?

उदाहरण के लिए, कि currying किसी तरह का करने के लिए इस्तेमाल किया जा सकता:

std::cout << [](int x){return [=](int y){return x+y;};}(1)(2); 

कैसे (एक बोनस के रूप + - हम बहुरूपी व्यवहार मिलेगा) बूस्ट लैम्ब्डा/फीनिक्स के साथ इसी तरह के उद्देश्य को प्राप्त करने के लिए?

+0

- मैं एक 'arg1' चाहता हूं मैं आंतरिक' बाइंड 'को पास कर सकता हूं, लेकिन बाहरी' बाइंड 'इसके बजाय खाता है। अगर मेरे पास तर्क प्लेसहोल्डर से बचने का कोई तरीका था ... – Yakk

+0

@Yakk, आप बूस्ट :: बाइंड का उपयोग करने का प्रयास कर सकते हैं - AFAIK यह लैम्ब्डा/फीनिक्स बाइंड से अलग है (http://www.boost.org/doc/ libs/1_53_0/डॉक्टर/एचटीएमएल/लैम्ब्डा/s08.html # idp111396608)। इसके अलावा, उत्तर के रूप में अपनी कोशिश का कोड पोस्ट करें - बक्षीस कल समाप्त होता है ... – qble

उत्तर

5

Boost Phoenix Scope: let/lambda

Live demo:

#include <boost/phoenix.hpp> 
#include <iostream> 
#include <ostream> 

using namespace std; 
using namespace boost; 
using namespace phoenix; 
using namespace arg_names; 
using namespace local_names; 

int main() 
{ 
    // capture by reference: 
    cout << 
     (lambda(_a=_1)[_1 + _a ])(1)(2) 
    << endl; 
    cout << 
     (lambda(_b=_1)[lambda(_a=_1)[_1 + _a + _b ]])(1)(2)(3) 
    << endl; 
    // capture by value: 
    cout << 
     (lambda(_a=val(_1))[_1 + _a ])(1)(2) 
    << endl; 
    cout << 
     (lambda(_b=val(_1))[lambda(_a=val(_1))[_1 + _a + _b ]])(1)(2)(3) 
    << endl; 
} 

आउटपुट है:

3 
6 
3 
6 
समस्या मैं यह है कि `arg1` सबसे बाहरी` bind` से भस्म हो जाता है जवाब देने के लिए कोशिश कर रहा था
+0

यही वह है जिसे मैं ढूंढ रहा हूं, धन्यवाद! – qble

+0

@EvgenyPanasyuk एक आलसी मूल्यांकन उत्पन्न करने का एक आसान तरीका है, जैसे '[&]() -> शून्य {fully_bound_expression_that_does_not_run_until_later; } '? – Yakk

+0

@Yakk, क्या आप विवरण में वर्णन कर सकते हैं कि आपका क्या मतलब है (शायद सी ++ 11 लैम्बडास के साथ पूर्ण उदाहरण के माध्यम से)? क्या आपका मतलब http://liveworkspace.org/code/30jCv6$0 है? या शायद http://liveworkspace.org/code/2Kon3g$0? –