Bagaimana cara mengirim file executable dengan Language.Haskell.Interpreter?

136

Saya berharap untuk menyematkan juru bahasa Haskell hintsehingga saya dapat menulis plugin di Haskell untuk digunakan dengan program saya. Saya tidak ingin mengirimkan seluruh platform Haskell untuk file executable saya.

Biasanya, file executable Haskell cukup mandiri. Misalnya, menghapus PATHtidak menimbulkan masalah:

$ PATH=. Hello
Hello world

Namun, program uji sederhana menggunakan runInterpreterbom jika saya menghapus 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"

Library atau executable apa yang harus tersedia di lingkungan agar dapat berfungsi?

otool tidak memberikan banyak petunjuk:

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)

Kode tes untuk TryHinttidak berbuat banyak:

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]

Itu hanya mengikat fke suatu fungsi Test.hsuntuk diinterpretasikan pada saat run-time. Test.hsterlihat seperti ini:

module Test where
f :: Int -> Int
f x = x + 1
Michael Fox
sumber
6
Saya tidak dapat mereproduksi masalah ini. Ketika saya menjalankan PATH= ./TryHintsemuanya berjalan lancar: mencetak beberapa angka, lalu keluar. Saya juga menggunakan GHC 7.8.3. Bagaimana Anda membangun TryHint?
Daniel Wagner
7
Saya juga yakin ini mungkin khusus untuk OSX. Anda mungkin ingin membuka tiket di pelacak GHC seperti yang disebutkan dalam pesan kesalahan (lagipula, hal yang tidak mungkin terjadi begitu saja).
MasterMastic
5
Saya tidak tahu apa yang terjadi dengan kesalahan itu, tetapi bagaimanapun juga GHC bergantung pada banyak sumber daya yang tidak Anda sembunyikan darinya PATH=., seperti file antarmuka untuk Prelude dan semua yang diimpor secara transit, file perpustakaan sebenarnya untuk base dan ghc-prim dan integer-gmp, serta settingsfile GHC . (Pada dasarnya, semua terinstal di bawah /usr/lib/ghcatau direktori yang setara untuk instalasi Anda.)
Reid Barton
2
@MichaelFox secara statis menautkan API GHC tidak berfungsi dengan penaut dinamis baru yang diperkenalkan di GHC 7.8, saya pikir: | (eksekusi kode interaktif sekarang membutuhkan pustaka dinamis)
bennofs
2
@bennofs sepertinya komentar Anda hampir menjadi jawaban jika Anda mengubah sedikit!
sclv

Jawaban:

2

Mengirim file yang dapat dieksekusi Language.Haskell.Interpretertampaknya berjalan sempurna dengan cara yang Anda tunjukkan. Anda harus mengatur Anda PATHke skrip yang ingin Anda jalankan.

Dan sebagai catatan tambahan, seperti yang disebutkan oleh @bennofs dalam komentar, Menautkan secara statis API GHC tidak berfungsi dengan penaut dinamis baru yang diperkenalkan di GHC 7.8, (eksekusi kode interaktif sekarang membutuhkan pustaka dinamis).

Himanshu Mishra
sumber