2016-08-16 2 views
13

से निपटने के लिए ओकैमल सीटीपीएस बेवकूफ तरीका मैं कुछ सी कार्यों के लिए ओकैमल रैपर लिख रहा हूं जो आउट-पैरामीटर मुहावरे का उपयोग करते हैं और एक त्रुटि कोड लौटाते हैं। मैं Ctypes.allocate_n का उपयोग कर ओकैमल पक्ष पर एक सी सरणी आवंटित करके उन्हें लपेट रहा हूं। और फिर सामग्री को ओकैमल प्रकार में कॉपी करना।आउट पैरामीटर

मुझे लगता है कि मैं एक समस्या के आसपास हैकिंग कर रहा हूं कि Ctypes या कुछ अन्य मॉड्यूल पहले से ही एक और तरीके से हल हो रहा है, यहां एक उदाहरण है।

int gethostname(char *name, size_t len); 

यहाँ लिपटे gethostname समारोह के लिए out_parameter.mli है:

gethostname(2) निम्न प्रकार है।

val gethostname : int -> [> `Ok of string | `Error of int];; 

यहाँ कार्यान्वयन है

open Core.Std;; 
let (@->) = Ctypes.(@->);; 
let returning = Ctypes.returning;; 
open Foreign;; 

let gethostname size = 
    let size' = Unsigned.Size_t.of_int size in 
    let c_gethostname = 
    foreign "gethostname" (Ctypes.ptr Ctypes.char @-> Ctypes.size_t @-> returning Ctypes.int) in 
    let buf = Ctypes.allocate_n Ctypes.char ~count:size in 
    let err = c_gethostname buf size' in 
    match err with 
    | 0 -> (
    `Ok (Ctypes.string_from_ptr buf ~length:size) 
    ) 
    | _ -> `Error err;; 

let main() = 
    Printf.printf "%s\n" (match gethostname 1000 with 
    | `Ok hostname -> hostname 
    | `Error _ -> "error getting hostname");; 

let() = main();; 

और compeleteness की खातिर मैं इस आदेश के साथ out_parameter.native संकलित।

$ corebuild -pkg ctypes.foreign out_parameter.native 

कोड काम करता है और पीछे हटने वाले नल बाइट्स के साथ होस्टनाम लौटाता है।

$ ./out_parameter.native 
MY-HOSTNAME 

$ ./out_parameter.native | sed -e 's/\x0/@/g' 
MY-HOSTNAME 

उत्तर

6

ऐसा लगता है कि आपका कोड काम करता है और मूर्खतापूर्ण है। त्रुटियों का प्रतिनिधित्व करने के दो तरीके हैं:

  • आप अपवाद फेंक सकते हैं।
  • आप परिणाम प्रकार का उपयोग कर सकते हैं। यदि आप ऐसा करते हैं, तो मैं "नया" बिल्टिन result प्रकार (जिसे result पैकेज में ओकैम के पुराने संस्करणों के लिए बैकपोर्ट किया गया है) का उपयोग करने की अनुशंसा करता हूं।

आम तौर पर, आप उस कोड को लिखने के लिए ज़िम्मेदार हैं जो उस त्रुटि सम्मेलन का समर्थन करता है (match err आपके कोड में भाग)। बॉयलरप्लेट को कम करने के लिए अक्सर कुछ संयोजकों को लिखना संभव होता है।

हालांकि, वहाँ अगर तुम Cstubs (कोड पीढ़ी) का उपयोग ctypes द्वारा प्रदान की एक जोड़ी शॉर्टकट हैं:

  • errno_policy libc के errno सम्मेलन लागू कर सकते हैं।
  • concurrency_policy सी कोड को ट्यून कर सकते हैं ताकि यह किसी दिए गए समवर्ती मॉडल (lwt, आदि) से मेल खा सके। यह त्रुटि सम्मेलनों के बारे में नहीं है, लेकिन कुछ हद तक संबंधित है।

आप Foreign से चिपके (जो अपने निर्माण प्रणाली Cstubs से अधिक आसान बनाता है), तो मैं हाथ से कर रही है, या एक जोड़े combinators निकालने यदि आप समान कार्य के लिए बहुत कुछ है की सलाह देते हैं।

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