Language.Haskell.Interpreter के साथ एक निष्पादन योग्य जहाज कैसे करें?


136

मैं एक हास्केल दुभाषिया का उपयोग करने की उम्मीद कर रहा था hintताकि मैं अपने कार्यक्रम के साथ उपयोग करने के लिए हास्केल में प्लगइन्स लिख सकूं। मैं अपने निष्पादकों के लिए पूरे हास्केल मंच को जहाज करना नहीं चाहता।

आम तौर पर, हास्केल निष्पादन योग्य बहुत आत्म-निहित होते हैं। उदाहरण के लिए, मिटाने से PATHकोई समस्या नहीं होती है:

$ PATH=. Hello
Hello world

हालाँकि, runInterpreterअगर मैं मिटाता हूं तो बमों का उपयोग करने वाला एक सरल परीक्षण कार्यक्रम PATH:

$ PATH=. TryHint
GhcException "panic! (the 'impossible' happened)\n  (GHC version 7.8.3 for x86_64-apple-darwin):\n\tDynamic linker not initialised\n\nPlease report this as a GHC bug:  http://www.haskell.org/ghc/reportabug\n"

इसे काम करने के लिए पर्यावरण में कौन से पुस्तकालय या निष्पादनयोग्य उपलब्ध हैं?

otool ज्यादा मार्गदर्शन नहीं देता:

otool -L TryHint
TryHint:
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1213.0.0)
    /usr/lib/libiconv.2.dylib (compatibility version 7.0.0, current version 7.0.0)
    /usr/local/lib/libgmp.10.dylib (compatibility version 13.0.0, current version 13.0.0)

परीक्षण कोड TryHintबहुत कुछ नहीं करता है:

import Control.Monad
import Language.Haskell.Interpreter

main = do
  f <- runInterpreter $ loadModules ["Test"] >> setTopLevelModules ["Test"] >> interpret "f" (as :: Int -> Int)
  case f of
    Left e -> print e
    Right r -> mapM_ (print . r) [1..10]

यह केवल रन-टाइम में व्याख्या किए जाने वाले fफ़ंक्शन को बांधता है Test.hsTest.hsइस तरह दिखता है:

module Test where
f :: Int -> Int
f x = x + 1

6
मैं इस समस्या को पुन: उत्पन्न नहीं कर सकता। जब मैं PATH= ./TryHintसब कुछ चलाता हूं तो आसानी से चला जाता है: यह कुछ संख्याओं को प्रिंट करता है, फिर बाहर निकलता है। मैं भी जीएचसी 7.8.3 का उपयोग कर रहा हूं। आप कैसे निर्माण कर रहे हैं TryHint?
डैनियल वैगनर

7
मेरा यह भी मानना ​​है कि यह OSX के लिए विशिष्ट होने की संभावना है। आप GHC के मैदान पर एक टिकट खोलने के लिए चाहते हो सकता है पर नजर के रूप में (सभी के बाद, असंभव त्रुटि संदेश में बताया गया था कि बस हो)।
17

5
मुझे नहीं पता कि उस त्रुटि के साथ क्या चल रहा है, लेकिन किसी भी स्थिति में जीएचसी बहुत सारे संसाधनों पर निर्भर करता है, जो आप इसके साथ नहीं छिपा रहे हैं PATH=., जैसे कि प्रस्तावना के लिए इंटरफ़ेस फाइलें और यह सब कुछ इसे संचरित रूप से आयात करता है, वास्तविक लाइब्रेरी फ़ाइलों के लिए बेस और जीएचसी-प्राइम और पूर्णांक-जीएमपी, और जीएचसी settingsफ़ाइल। (मूल रूप से, सब कुछ /usr/lib/ghcआपके इंस्टालेशन के लिए या उसके बराबर निर्देशिका में स्थापित किया गया है ।)
बार्टन

2
@MichaelFox जीएचसी एपीआई को स्टेटिकली लिंक करने से जीएचसी 7.8 में पेश किए गए नए डायनेमिक लिंकर के साथ काम नहीं करता, मुझे लगता है: | (संवादात्मक कोड निष्पादन के लिए अब गतिशील पुस्तकालयों की आवश्यकता होती है)
बेन्फ्स

2
@bennofs ऐसा लगता है कि आपकी टिप्पणी लगभग एक उत्तर है यदि आप इसे थोड़ा सा दोहराते हैं!
sclv

जवाबों:


2

Language.Haskell.Interpreterआपके द्वारा दिखाए गए तरीके के साथ एक निष्पादन योग्य शिपिंग सही लगता है। आपको अपनी PATHस्क्रिप्ट को सेट करना होगा जिसे आप निष्पादित करना चाहते हैं।

और जैसा कि साइड नोट, जैसा कि @bennofs द्वारा टिप्पणियों में उल्लेख किया गया है, जीएचसी एपीआई को स्टेटिक रूप से लिंक करने से जीएचसी 7.8 में पेश किए गए नए डायनेमिक लिंकर के साथ काम नहीं करता है, (इंटरेक्टिव कोड निष्पादन के लिए अब डायनामिक लाइब्रेरी की आवश्यकता होती है)।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.