Language.Haskell.Interpreter ile çalıştırılabilir bir dosya nasıl gönderilir?


136

hintProgramımla kullanmak için Haskell'de eklentiler yazabilmem için bir Haskell tercümanı yerleştirmeyi umuyordum . Yürütülebilirlerim için tüm Haskell platformunu göndermek istemiyorum.

Normalde, Haskell yürütülebilir dosyaları oldukça bağımsızdır. Örneğin, bunu silmek PATHsoruna neden olmaz:

$ PATH=. Hello
Hello world

Ancak, runInterpretersilerseniz bomba kullanan basit bir test programı 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"

Çalışması için ortamda hangi kitaplıkların veya yürütülebilir dosyaların bulunması gerekir?

otool fazla yol göstermez:

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)

İçin test kodu TryHintfazla bir şey yapmaz:

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]

Sadece çalışma zamanında yorumlanacak fbir işleve bağlanır Test.hs. Test.hsbuna benzer:

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

6
Bu sorunu yeniden oluşturamıyorum. Koştuğumda PATH= ./TryHinther şey yolunda gidiyor: birkaç sayı yazdırıyor, sonra çıkıyor. Ayrıca GHC 7.8.3 kullanıyorum. Nasıl inşa TryHintediyorsunuz?
Daniel Wagner

7
Ayrıca OSX'e özgü olabileceğine inanıyorum. Sen GHC en az bir bilet açmak isteyebilirsiniz izleyici (sonuçta imkansız hata mesajında belirtildiği gibi yoktu sadece olur).
MasterMastic

5
Bu hatayla ne olduğu hakkında hiçbir fikrim yok, ancak her durumda GHC PATH=., Prelude için arayüz dosyaları ve geçiş yaptığı her şey, gerçek kütüphane dosyaları gibi , ondan saklanmadığınız birçok kaynağa bağlıdır. base ve ghc-prim ve integer-gmp ve GHC settingsdosyası. (Temel olarak, her şey kurulumunuz için /usr/lib/ghcveya eşdeğer dizinin altına kurulur .)
Reid Barton

2
@MichaelFox GHC API statik olarak bağlayan GHC 7.8 tanıttı yeni dinamik bağlayıcı ile çalışmıyor, bence: | (etkileşimli kod yürütme için şimdi dinamik kütüphaneler gerekir)
bennofs

2
@bennofs, yorumunuzu biraz geri çevirirseniz neredeyse bir cevap gibi görünüyor!
sclv

Yanıtlar:


2

Yürütülebilir bir dosyanın Language.Haskell.Interpreternakliyesi, gösterdiğiniz şekilde mükemmel görünüyor. PATHÇalıştırmak istediğiniz komut dosyasına ayarlamanız gerekir .

Yan not olarak, yorumlarda @bennofs tarafından belirtildiği gibi, GHC API'sini statik olarak bağlamak, GHC 7.8'de tanıtılan yeni dinamik bağlayıcı ile çalışmaz (etkileşimli kod yürütme artık dinamik kütüphaneler gerektirir).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.