ocaml

2009-05-31 11 views
23

में {मूल्य के साथ एक्स} मैं Yacfe example में निम्नलिखित समारोह कॉल देखा:ocaml

Visitor_c.vk_program { Visitor_c.default_visitor_c with 
    Visitor_c.kexpr = (fun (k, bigf) exp -> 
     match Ast_c.unwrap_expr exp with 
     | Binary(e1, Logical (Eq), (((Constant(Int("0")) as _e2),_t),ii)) -> 

      (match Ast_c.get_onlytype_expr e1 with 
      | Some (qu, (Pointer _,_ii)) -> 

       let idzero = Common.tuple_of_list1 ii in 
       idzero.cocci_tag := 
       Ast_cocci.MINUS (Ast_cocci.NoPos, [[null_addon]]), []; 

      | _ -> k exp 
     ) 
     | _ -> k exp 
    ); 
    } ast; 

मैं पहली बार तर्क के रूप में प्रारंभ रिकॉर्ड के साथ एक समारोह कॉल देख सकते हैं, और ast दूसरा तर्क के रूप में।

{Visitor_c.default_visitor_c with Visitor_c.kexpr = some_value;} 

क्या इसका मतलब यह है:

क्या मैं से परिचित नहीं हूँ प्रपत्र की वाक्य रचना है? मुझे पता है कि एक रिकॉर्ड {name=value;name=value;...} की तरह शुरू किया जा सकता है, लेकिन मैं {X with name=value} से परिचित नहीं हूं, क्या आप मुझे बता सकते हैं इसका क्या अर्थ है?

मैं कानूनी रिकॉर्ड मान निम्न के अलावा अन्य आरंभीकरण के बारे में कुछ भी नहीं Ocaml Manual में नहीं मिल सकता है:

मूल्यों की

6.2.3 रिकॉर्ड्स

रिकार्ड मूल्यों लेबल रहे हैं tuples। रिकॉर्ड मूल्य लिखा गया { फ़ील्ड 1 = v1; ...; fieldn = vn} i = 1 ... n के लिए मान vi को रिकॉर्ड फ़ील्ड फ़ील्ड से जोड़ता है। वर्तमान कार्यान्वयन रिकॉर्ड 222 - 1 फ़ील्ड (4194303 फ़ील्ड) के साथ करता है।

मुझे खुशी होगी अगर आपके उत्तर में आप ओकैमल मैनुअल में प्रासंगिक अनुभाग का संदर्भ शामिल करेंगे।

उत्तर

34

इसे कभी-कभी "रिकॉर्ड अपडेट" या "कार्यात्मक अद्यतन" या ऐसा कुछ कहा जाता है। यह एक्स के समान प्रकार के एक नए रिकॉर्ड का मूल्यांकन करता है, और जिनके फ़ील्ड एक्स के समान होते हैं, जो "साथ" के बाद सूचीबद्ध होते हैं, जिन्हें दिए गए मानों के लिए प्रारंभ किया जाता है।

यह अपरिवर्तनीय रिकॉर्ड के लिए उपयोगी है, इस तरह के रिकॉर्ड लेने के लिए एक सुविधाजनक तरीका है और उस पर एक या दो चीजें बदलना (जो एक अनिवार्य भाषा में आप आम तौर पर खेतों को बदल देंगे), सभी क्षेत्रों को सूचीबद्ध किए बिना जो नहीं बदले गए हैं।

यह ओकैमल मैनुअल section 6.7.3 में वर्णित है, "रिकॉर्ड्स" तक स्क्रॉल करें, दूसरा अनुच्छेद।

जो लोग हास्केल, OCaml वाक्य रचना

{ expr with field1 = expr1 ; ... ; fieldn = exprn } 

से परिचित हैं के लिए हास्केल वाक्य रचना

expr { field1 = expr1 , ... , fieldn = exprn } 
+0

धन्यवाद। मैं इसे कैसे गूगल कर सकता हूं? यह मैनुअल में बहुत गहरा है, और मैं इसे आसानी से नहीं ढूंढ सका। –

+3

मुझे नहीं पता कि आप इसे कैसे Google करेंगे। मैं बस यह जानना हुआ। लेकिन उस पृष्ठ के शीर्ष पर (धारा 6।7) OCaml में मान्य सभी अभिव्यक्तियों के व्याकरण की सूची है, इसलिए यदि आप एक अभिव्यक्ति को समझना चाहते हैं तो आप पहले वहां शुरू कर सकते हैं, और यदि आप इसे उचित भाग में स्क्रॉल करते हैं जो इसका वर्णन करता है। और सामान्य रूप से, अध्याय 6 ओकैमल भाषा के व्याकरण के विभिन्न पहलुओं से संबंधित है; प्रकार अभिव्यक्तियों, पैटर्न, कक्षाओं, मॉड्यूल इत्यादि से निपटने वाले वर्ग हैं। इसलिए यदि आपको कुछ भी देखने की ज़रूरत है तो मैं पहले उचित अनुभाग में शुरू करूंगा। – newacct

+0

वाह, मुझे नहीं पता था कि आप 'fieldn = expern' सूचीबद्ध कर सकते हैं; '। धन्यवाद! –

14

पिछले जबाब को ठीक करने के रूप में ही है, नया रिकार्ड की हमेशा नहीं है पुराने रिकॉर्ड के समान प्रकार। उदाहरण के लिए, आप ऐसा ही कुछ हो सकता है: new_t प्रकार int t की है, जबकि,

type 'a t = { 
    id : int; 
    value : 'a; 
} 
let old_t = { id = 3; value = "foo" } 
let new_t = { old_t with value = 3 } 

नतीजतन, old_t प्रकार string t की है।