2012-01-19 7 views
11

मेरे पास एक हास्केल प्रोजेक्ट है जो नियमित रूप से बहुत सारी भाषा सुविधाओं का उपयोग करता है, और मैं चाहता हूं कि प्रत्येक स्रोत फ़ाइल के लिए भाषा एक्सटेंशन ब्लॉक समान हो। यहाँ एक सूची,हैकेल - LANGUAGE pragmas के अपने समूह को रोल करने का कोई तरीका?

{-# LANGUAGE Arrows, 
      BangPatterns, 
      DefaultSignatures, 
      DeriveDataTypeable, 
      DeriveFunctor, 
      EmptyDataDecls, 
      FlexibleContexts, 
      FlexibleInstances, 
      FunctionalDependencies, 
      GADTs, 
      GeneralizedNewtypeDeriving, 
      MultiParamTypeClasses, 
      NamedFieldPuns, 
      NoImplicitPrelude, 
      NoMonomorphismRestriction, 
      OverlappingInstances, 
      RankNTypes, 
      RebindableSyntax, 
      ScopedTypeVariables, 
      StandaloneDeriving, 
      TemplateHaskell, 
      TypeFamilies, 
      TypeOperators, 
      TypeSynonymInstances, 
      UndecidableInstances, 
      ViewPatterns #-} 
हो सकता है कि कुछ यह बुरा व्यवहार है करने के लिए

है, लेकिन मैं "हास्केल +" है कि मैं आम तौर पर में कोड लिखने का हिस्सा बनने के भाषा एक्सटेंशन पर विचार करें। और, मुझे लगता है कि एक ही भर मॉड्यूल होना चाहता हूँ। उदाहरण के लिए, NoImplicitPrelude भाषा नाटकीय रूप से बदलता है, और मैं इसे सभी मॉड्यूल के लिए वर्दी चाहता हूं।

प्रश्न: मैं प्रत्येक फ़ाइल में भाषा ब्लॉक को कॉपी-पेस्ट किए बिना इसे कैसे प्राप्त कर सकता हूं? यह परेशान हो जाता है कि मैं अक्सर एक नई भाषा सुविधा कैसे सीखता हूं, इसे मॉड्यूल A पर जोड़ें, फिर मॉड्यूल B पर काम करना प्रारंभ करें, और मुझे एहसास है कि मुझे मॉड्यूल A से भाषा ब्लॉक की प्रतिलिपि बनाना है।

बस FYI एक #include साथ CPP pragma नहीं चाल क्या करता है! अग्रिम में धन्यवाद।

+0

पूर्व यहां विचित्र संबंधित प्रश्न: http://stackoverflow.com/questions/6005382/haskell-ways-to-have-a-clean-import-block-re-exporting-modules-multiple-im – gatoatigrado

+2

मैं दृढ़ता से सुझाव देता हूं कि ' डिफ़ॉल्ट एक्सटेंशन की आपकी सूची में ओवरलैपिंग इंस्टेंस '। – ehird

+0

@ehird, अच्छा बिंदु; हालांकि कभी-कभी इसका उपयोग किया जाता है। – gatoatigrado

उत्तर

14
अपने निर्माण प्रणाली के रूप में

कबाल का प्रयोग करें, और आप अपने project.cabal फ़ाइल के Library या Executable खंड के Extensions क्षेत्र में चाहते भाषा एक्सटेंशन की सूची। फिर अपने हास्केल स्रोत फ़ाइलों से LANGUAGE ब्लॉक को हटा दें।

परिचय के तीसरे पैराग्राफ सहित Cabal User Guide देखें।


Ghci वह सब नीचे गिर जाता है। cabal ghci कमांड जोड़ने की बात है, लेकिन इस बीच में यह थोड़ा सा मुश्किल है।

यदि आपकी परियोजना एक लाइब्रेरी है, तो आप ghci -package-conf dist/package.conf.inplace चला सकते हैं।

आप GHCi में unexposed मॉड्यूल लोड करने के लिए चाहते हैं, तो मैं अपने project.cabal में एक "विकास मोड" झंडा निर्धारित करेंगे:

Flag development 
    Description:   Development mode: expose all modules, enable warnings. 
    Default:    False 

... सशर्त विकास मोड में अतिरिक्त मॉड्यूल का पर्दाफाश:

Library 
    Exposed-modules:  My.Module, My.Module.Extra 
    if flag(development) 
    Exposed-modules: My.Module.Hidden, My.Module.Secret 
    GHC-Options:  -Wall 
    -- plus your extensions, etc 

... और जब आप cabal configure चलाने स्पष्ट रूप से विकास मोड सक्षम:

$ cabal configure -f development 
+0

अच्छा लग रहा है। सिर्फ एक प्रश्न: मैं ghci का उपयोग कैसे करूं? (अधिमानतः प्रोजेक्ट में किसी भी मॉड्यूल पर - मैं हर बार कैबल फ़ाइल को संपादित नहीं करना चाहता) – gatoatigrado

+1

मेरा संपादन देखें। क्या मैंने हर बार कैबल फ़ाइल को संपादित नहीं करना चाहते हैं, इस बारे में सही ढंग से अपना मुद्दा समझ लिया? – dave4420

+0

अस्पष्ट होने के लिए खेद है। संपादन निश्चित रूप से उपयोगी हैं, लेकिन मुझे नहीं लगता कि मैं क्या देख रहा हूं। मान लीजिए कि मैं मॉड्यूल 'ए' पर काम कर रहा हूं। फिर, बिना कैबल के, मैं 'ghci ए' टाइप कर सकता हूं, और यह लोड करने का प्रयास करेगा। मैं 'आर' के साथ फिर से लोड कर सकता हूं, जब तक यह काम नहीं करता है, और फिर 'एल बी' टाइप करके मॉड्यूल 'बी' पर काम करने के लिए आगे बढ़ें (या बाहर निकलने और 'ghci बी' चलाना)। – gatoatigrado

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