2012-12-21 9 views
7

वर्तमान में मैं सभी पार्सिंग, टाइप चेकिंग इत्यादि से निपटने के बिना हास्केल सबसेट से अनुवाद करने की कोशिश कर रहा हूं। दस्तावेज़ीकरण ने मुझे कार्य के शरीर (सभी परिभाषाओं) को इसके नाम से प्राप्त करने के लिए एक समारोह को समझने में मदद नहीं की। इस कॉल के लिएफ़ंक्शन का शरीर प्राप्त करने के लिए टेम्पलेट हास्केल का उपयोग कैसे करें?

प्रसंग

fac 0 = 1 
fac x = z * fac (x - 1) 

getBody = ... 

main = do 
    x <- runQ $ getBody [| fac |] 
    print x 

कुछ ऐसा दिखाई देगा किसी को

  1. करता है कुछ अच्छे और वें पर तारीख डॉक्स (नहीं Hackage पर संदर्भ) या
  2. अप करने के लिए देखते हैं कि क्या
  3. GetBody कैसे बनाएं?
+1

आप 'runQ' के साथ क्या करने का प्रयास कर रहे हैं? निश्चित रूप से सुनिश्चित करें कि आप उस जानकारी को प्राप्त करने के लिए कोई रास्ता नहीं ले रहे हैं जिसे आप रन-टाइम पर TH का उपयोग करने का प्रयास करना चाहते हैं। –

उत्तर

10

सामान्यतः, TH के साथ कुछ की परिभाषा को खोजने का तरीका reify फ़ंक्शन का उपयोग कर रहा है। हालांकि:

  • आप can't use reify at run-timerunQ के माध्यम से। संकलन के दौरान इसे आवश्यक जानकारी उपलब्ध नहीं है।

  • वर्तमान में, फ़ंक्शन परिभाषाएं प्राप्त करने के लिए reify का उपयोग करके not implemented due to lack of interest है।

ऐसा लगता है कि आपको एक और मार्ग खोजने की आवश्यकता होगी। क्या आपने पार्सिंग और/या जीएचसी एपीआई या इसके आधार पर कुछ के लिए the haskell-src-exts package का उपयोग करने पर विचार किया है?

+0

हां, हम रन-टाइम पर पुनः उपयोग का उपयोग नहीं कर सकते हैं, लेकिन हम डेटा का उपयोग कर सकते हैं। ऐसा लगता है (जीएचसी मंच प्रतिबंध के कारण इस कोड को 2 मॉड्यूल में विभाजित करने की आवश्यकता है; जीएचसीआई में भी चलता है): 'conv1 (TyConI x) = [| TyConI $ (conv2 x) |] ' 'conv2 (डेटा डी _ नाम _ _ _) = [| डेटाडी [] (एमकेनाम $ ($ LitE $ stringL $ शो नाम लौटाएं)) [] [] [] |] ' ' मुख्य = प्रिंट $ ('इंट >> = conv1' को पुनः प्राप्त करें ' इसके अलावा,' पुनः प्राप्त करें ' समारोह के _call_ के लिए एएसटी वापस कर देगा, लेकिन यह शरीर नहीं है, वैसे भी। वहाँ reifyDecl समारोह होना चाहिए, जो वास्तव में अनुपस्थित है। मैं आपकी मदद के लिए वास्तव में आभारी हूं। धन्यवाद। –

+0

@ polkovnikov.ph: आम तौर पर किसी चीज़ के नाम पर 'पुनः प्राप्त करें' का उपयोग करके आपको घोषणा मिलती है, जब यह समझ में आता है - एक प्रकार के लिए यह आपको रचनाकारों की सूची, 'व्युत्पन्न' सूची, और इसी तरह की जानकारी देगा। किसी फ़ंक्शन के नाम को पुनः प्राप्त करने से आपको जानकारी के लिए 'VarI' मिलती है, जिसमें' हो सकता है 'मूल्य होता है, यानी एक घोषणा। यदि मैं समझ रहा हूं कि आप क्या चाहते हैं, 'पुनः प्राप्त करें' यह करेगा, यह अभी अभी लागू नहीं हुआ है क्योंकि स्पष्ट रूप से कुछ अन्य लोग इसे चाहते हैं। –

+0

किसी को भी जो इसे पढ़ सकता है: मुझे निकट भविष्य में इस सुविधा पर काम करने में दिलचस्पी होगी। मैं वास्तव में इसका इस्तेमाल कर सकता था। – jtobin

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

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