2014-04-23 7 views
7

के लिए सी/सी ++ रैपर मैं सी/सी ++ से हास्केल फ़ंक्शन को कॉल करना चाहता हूं। मैंने पहले से ही उस विषय से संबंधित कुछ ट्यूटोरियल पढ़े हैं, लेकिन आईओ मोनैड कॉल उनसे शामिल नहीं हैं। विशेष रूप से, मैं एक फ़ंक्शन को कॉल करना चाहता हूं जो interact फ़ंक्शन (interact :: (String -> String) -> IO()) का उपयोग करता है।हास्केल आईओ मोनड

  • मुझे समझ में नहीं आता कि इस मामले में फ़ंक्शंस का उपयोग कैसे करें?
  • मैं सी/सी ++ रैपर में फ़ंक्शन कैसे घोषित कर सकता हूं?
  • मानक इनपुट/आउटपुट का नियंत्रण सी/सी ++ और हास्केल (सी/सी ++ कोड में) के बीच कैसे स्थानांतरित किया जाएगा?
+0

क्या आप हास्केल से सीस्क, या सी से हास्केल को कॉल करना चाहते हैं? – acomar

+0

@acomar मेरा मानना ​​है कि ओपी सी – duplode

+0

@ डुपलोड से हास्केल को कॉल करना चाहता है बिल्कुल, मैं सी/सी ++ – Simplex

उत्तर

2

मैं इस उत्तर को अपेक्षाकृत संक्षिप्त रखने जा रहा हूं क्योंकि इनमें से अधिकांश FFI documentation में शामिल है।

आप उन्हें नाम सी में कार्य foreign export के रूप में घोषित किया जाना चाहिए द्वारा फोन करके कार्यों का उपयोग कर सकते हैं और यह हास्केल में एक सी मॉड्यूल में परिभाषित कार्यों फोन करने के लिए foreign import वाक्य रचना समानताएं। सी में, आपको फ़ंक्शन को extern के रूप में घोषित करने की आवश्यकता होगी और इसे सामान्य प्रकार का हस्ताक्षर दें।

आपका interact समारोह सीधे घोषित नहीं किया जा सकता यह प्रकार है कि सी में परिभाषित नहीं कर रहे हैं आप को परिभाषित करने और एक संबंधित समारोह है कि हास्केल में interact कॉल लिख सकते हैं संदर्भ देता है क्योंकि: तो

interact_hs :: FunPtr (CString -> CString) -> IO() 

इस समारोह होगा interact पर कॉल करने के लिए अपने तर्क (रैपिंग के साथ) का उपयोग करना होगा।

सी में इस समारोह तो दिखाई देता है:

extern void interact_hs(char*(*f)(char*)); 

या यह कुछ ऐसा है, मेरे समारोह सूचक वाक्य रचना जंग लगी है।

वास्तव में सी से इस फ़ंक्शन को कॉल करने के लिए, आपको हास्केल रनटाइम (प्रलेखन में शामिल) को प्रारंभ करना होगा, फिर फ़ंक्शन को कॉल करें, जिस पर निष्पादन का बिंदु नियंत्रण हास्केल में गुजरता है। एक बार जब समारोह पूरा करता है और रिटर्न, निष्पादन के नियंत्रण सी में वापस FFI के साथ काम करने के लिए

अन्य उपयोगी संसाधनों से गुजरता है:

  • GHC documentation
  • असली दुनिया हास्केल के chapter FFI
  • एडवर्ड जेड पर यांग के blog post series एफएफआई और सी 2 एच प्रीप्रोसेसर

अन्य उपयोगी लिंक का सुझाव देने के लिए स्वतंत्र महसूस करें!

+0

से हास्केल को कॉल करना चाहता हूं बहुत बहुत धन्यवाद! मैं इस समस्या को हल करता हूँ! – Simplex

संबंधित मुद्दे