2015-01-29 9 views
135

Speravo di incorporare un interprete Haskell usando hint in modo da poter scrivere plugin in Haskell da utilizzare con il mio programma. Non voglio dover spedire la maledetta piattaforma Haskell per i miei eseguibili. Normalmente, gli eseguibili di Haskell sono piuttosto autosufficienti. Ad esempio, cancellando il PATH non causa un problema:Come spedire un eseguibile con Language.Haskell.Interpreter?

$ PATH=. Hello 
Hello world 

Tuttavia, un semplice programma di test utilizzando runInterpreter bombe se cancellare il 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" 

Quali biblioteche o eseguibili devono essere disponibili nell'ambiente per farlo funzionare?

otool non dà molte indicazioni:

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) 

Il codice di prova per TryHint non fa molto:

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] 

E 'appena si lega f a una funzione in Test.hs essere interpretati in run-time. Test.hs assomiglia a questo:

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

Non riesco a riprodurre questo problema. Quando eseguo 'PATH =./TryHint' tutto va liscio: stampa alcuni numeri, quindi esce. Sto anche usando GHC 7.8.3. Come stai costruendo 'TryHint'? –

+1

Che dire di 'PATH =. TryHint' (nota dove si trova lo spazio)? L'eseguibile 'TryHint' dovrebbe essere nella directory di lavoro corrente. – ErikR

+0

@ user5402 Ho provato entrambi. Sono esattamente uguali. –

risposta

2

spedizione un eseguibile con Language.Haskell.Interpreter sembra andare perfetto con il modo in cui avete dimostrato. Devi impostare il tuo PATH per lo script che si desidera eseguire.

E come nota a margine, come menzionato da @bennofs nei commenti, il collegamento statico dell'API GHC non funziona con il nuovo linker dinamico introdotto in GHC 7.8 (l'esecuzione del codice interattivo ora richiede librerie dinamiche).

Problemi correlati