วิธีการจัดส่งโปรแกรมเรียกใช้งานด้วย Language.Haskell.Interpreter


136

ฉันหวังว่าจะใช้ล่าม Haskell hintเพื่อที่ฉันจะได้เขียนปลั๊กอินใน Haskell เพื่อใช้กับโปรแกรมของฉัน ฉันไม่ต้องการจัดส่งแพลตฟอร์ม Haskell ทั้งหมดสำหรับโปรแกรมปฏิบัติการของฉัน

โดยปกติ executables ของ Haskell นั้นมีอยู่ในตัวเอง ตัวอย่างเช่นการลบPATHจะไม่ทำให้เกิดปัญหา:

$ PATH=. Hello
Hello world

อย่างไรก็ตามโปรแกรมทดสอบอย่างง่ายโดยใช้runInterpreterระเบิดถ้าฉันลบ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"

ไลบรารีหรือไฟล์ปฏิบัติการใดที่ต้องมีอยู่ในสภาพแวดล้อมเพื่อให้ทำงานได้?

otool ไม่ได้ให้คำแนะนำมาก:

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)

รหัสทดสอบสำหรับTryHintทำไม่มาก:

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]

มันแค่ผูกfกับฟังก์ชั่นTest.hsที่จะตีความในเวลาทำงาน Test.hsมีลักษณะเช่นนี้:

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

6
ฉันทำซ้ำปัญหานี้ไม่ได้ เมื่อฉันรันPATH= ./TryHintทุกอย่างเป็นไปอย่างราบรื่น: มันพิมพ์ตัวเลขออกมาไม่กี่ตัว ฉันใช้ GHC 7.8.3 ด้วย คุณเป็นTryHintอย่างไรบ้าง
Daniel Wagner

7
ฉันยังเชื่อว่ามีแนวโน้มที่จะเฉพาะเจาะจงกับ OSX คุณอาจต้องการเปิดตั๋วที่ตัวติดตามของ GHC ตามที่ระบุไว้ในข้อความแสดงข้อผิดพลาด (หลังจากทั้งหมดสิ่งที่เป็นไปไม่ได้เกิดขึ้น)
MasterMastic

5
ฉันไม่รู้ว่าเกิดอะไรขึ้นกับข้อผิดพลาดนั้น แต่ในกรณีใด ๆ GHC ขึ้นอยู่กับทรัพยากรจำนวนมากที่คุณไม่ได้ซ่อนตัวอยู่ด้วยPATH=.เช่นไฟล์อินเตอร์เฟสสำหรับ Prelude และทุกสิ่งที่นำเข้าโดยผ่าน base และ ghc-prim และ integer-gmp และsettingsไฟล์GHC (โดยพื้นฐานแล้วทุกอย่างที่ติดตั้งภายใต้/usr/lib/ghcหรือไดเรกทอรีที่เทียบเท่าสำหรับการติดตั้งของคุณ)
Reid Barton

2
@MichaelFox การลิงก์ GHC API แบบสแตติกไม่ทำงานกับตัวเชื่อมโยงแบบไดนามิกใหม่ที่นำมาใช้ใน GHC 7.8 ฉันคิดว่า: | (ตอนนี้การเรียกใช้โค้ดเชิงโต้ตอบต้องใช้ไลบรารีแบบไดนามิก)
bennofs

2
@bennofs ดูเหมือนว่าความคิดเห็นของคุณเกือบเป็นคำตอบถ้าคุณใส่รหัสใหม่อีกเล็กน้อย!
sclv

คำตอบ:


2

การจัดส่งโปรแกรมเรียกใช้งานด้วยLanguage.Haskell.Interpreterดูเหมือนว่าจะสมบูรณ์แบบตามที่คุณแสดง คุณต้องตั้งค่าPATHสคริปต์ที่คุณต้องการใช้งาน

และตามหมายเหตุข้างต้นตามที่ระบุไว้โดย @bennofs ในความคิดเห็นการเชื่อมโยงแบบคงที่ GHC API ไม่ทำงานกับตัวเชื่อมโยงแบบไดนามิกใหม่ที่นำมาใช้ใน GHC 7.8 (ตอนนี้การเรียกใช้โค้ดเชิงโต้ตอบต้องใช้ไลบรารีแบบไดนามิก)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.