Làm cách nào để gửi một tệp thực thi với Language.Haskell.Interpreter?


136

Tôi đã hy vọng nhúng một trình thông dịch Haskell bằng cách sử dụng hintđể tôi có thể viết các plugin trong Haskell để sử dụng với chương trình của mình. Tôi không muốn phải vận chuyển toàn bộ nền tảng Haskell cho các tệp thực thi của mình.

Thông thường, các tệp thực thi Haskell khá khép kín. Ví dụ: xóa PATHkhông gây ra vấn đề:

$ PATH=. Hello
Hello world

Tuy nhiên, một chương trình thử nghiệm đơn giản sử dụng runInterpreterbom nếu tôi xóa 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"

Những thư viện hoặc thực thi nào phải có sẵn trong môi trường để nó hoạt động?

otool không đưa ra nhiều hướng dẫn:

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)

Mã kiểm tra TryHintkhông làm được gì nhiều:

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]

Nó chỉ liên kết fvới một chức năng Test.hsđể được giải thích tại thời gian chạy. Test.hstrông như thế này:

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

6
Tôi không thể tái tạo vấn đề này. Khi tôi chạy PATH= ./TryHintmọi thứ diễn ra suôn sẻ: nó in một vài số, sau đó thoát ra. Tôi cũng đang sử dụng GHC 7.8.3. Bạn đang xây dựng TryHintnhư thế nào?
Daniel Wagner

7
Tôi cũng tin rằng nó có khả năng dành riêng cho OSX. Bạn có thể muốn mở một vé tại GHC của tracker như đã đề cập trong thông báo lỗi (sau khi tất cả, những điều không thể không chỉ xảy ra).
MasterMastic

5
Tôi không biết điều gì đang xảy ra với lỗi đó, nhưng trong mọi trường hợp, GHC phụ thuộc vào rất nhiều tài nguyên mà bạn không giấu nó PATH=., chẳng hạn như các tệp giao diện cho Prelude và mọi thứ mà nó nhập quá mức, các tệp thư viện thực tế cho cơ sở và ghc-prim và số nguyên-gmp và settingstệp GHC . (Về cơ bản, mọi thứ được cài đặt bên dưới /usr/lib/ghchoặc thư mục tương đương cho cài đặt của bạn.)
Reid Barton

2
@MichaelFox liên kết tĩnh API GHC không hoạt động với trình liên kết động mới được giới thiệu trong GHC 7.8, tôi nghĩ: | (thực thi mã tương tác hiện yêu cầu các thư viện động)
bennofs

2
@bennofs có vẻ như bình luận của bạn gần như là một câu trả lời nếu bạn hơi chỉnh lại nó!
sclv

Câu trả lời:


2

Vận chuyển một thực thi với Language.Haskell.Interpreterdường như đi hoàn hảo với cách bạn đã thể hiện. Bạn phải đặt tập lệnh của bạn PATHthành tập lệnh bạn muốn thực thi.

Và như lưu ý phụ, như được đề cập bởi @bennofs trong các nhận xét, Liên kết tĩnh API GHC không hoạt động với trình liên kết động mới được giới thiệu trong GHC 7.8, (hiện thực thi mã tương tác yêu cầu các thư viện động).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.