Come spedire un eseguibile con Language.Haskell.Interpreter?


136

Speravo di incorporare un interprete Haskell usando in hintmodo da poter scrivere plugin in Haskell da usare con il mio programma. Non voglio spedire l'intera piattaforma Haskell per i miei eseguibili.

Normalmente, gli eseguibili Haskell sono piuttosto indipendenti. Ad esempio, la cancellazione di PATHnon causa problemi:

$ PATH=. Hello
Hello world

Tuttavia, un semplice programma di test che utilizza runInterpreterbombe se cancello 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 librerie o file eseguibili devono essere disponibili nell'ambiente affinché funzioni?

otool non fornisce molta guida:

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 test per TryHintnon 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]

Si lega semplicemente fa una funzione Test.hsda interpretare in fase di esecuzione. Test.hsSomiglia a questo:

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

6
Non riesco a riprodurre questo problema. Quando corro PATH= ./TryHinttutto procede senza intoppi: stampa alcuni numeri, quindi esce. Sto anche usando GHC 7.8.3. Come stai costruendo TryHint?
Daniel Wagner,

7
Credo anche che sia specifico per OSX. Potresti voler aprire un ticket sul tracker di GHC, come indicato nel messaggio di errore (dopo tutto, l'impossibile è appena accaduto).
MasterMastic,

5
Non ho idea di cosa stia succedendo con quell'errore, ma in ogni caso GHC dipende da molte risorse con cui non ti nascondi PATH=., come i file di interfaccia di Prelude e tutto ciò che importa in modo transitorio, i file di libreria effettivi per base e ghc-prim e integer-gmp e il settingsfile GHC . (Fondamentalmente, tutto installato sotto /usr/lib/ghco la directory equivalente per l'installazione.)
Reid Barton

2
@MichaelFox che collega staticamente l'API GHC non funziona con il nuovo linker dinamico introdotto in GHC 7.8, penso: | (l'esecuzione del codice interattivo ora richiede librerie dinamiche)
bennofs,

2
@bennofs sembra che il tuo commento sia quasi una risposta se lo riformuli leggermente!
sclv,

Risposte:


2

La spedizione di un eseguibile con Language.Haskell.Interpretersembra andare perfettamente con il modo in cui hai mostrato. Devi impostare il tuo PATHscript 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).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.