ল্যাঙ্গুয়েজ.হ্যাসকেল.ইনটারপ্রেটার দিয়ে এক্সিকিউটেবলকে কীভাবে পাঠানো যায়?


136

আমি হ্যাস্কেল দোভাষীকে ব্যবহার করে এম্বেড করার আশা করছিলাম hintযাতে আমি আমার প্রোগ্রামের সাথে ব্যবহার করতে হাস্কেলের প্লাগইন লিখতে পারি। আমি আমার এক্সিকিউটেবলের জন্য পুরো হাস্কেল প্ল্যাটফর্মটি জাহাজে রাখতে চাই না।

সাধারণত, হাস্কেল এক্সিকিউটেবলগুলি বেশ স্ব-অন্তর্ভুক্ত। উদাহরণস্বরূপ, মুছে ফেলা 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.hsTest.hsএটা এমন দেখতে:

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

6
আমি এই সমস্যাটি পুনরুত্পাদন করতে পারি না। আমি যখন রান করি তখন PATH= ./TryHintসবকিছু মসৃণ হয়: এটি কয়েকটি সংখ্যক মুদ্রণ করে, তারপরে প্রস্থান করে। আমি জিএইচসি 7.8.3 ব্যবহার করছি। আপনি কিভাবে তৈরি করছেন TryHint?
ড্যানিয়েল ওয়াগনার

7
আমি এটিও বিশ্বাস করি যে এটি ওএসএক্সের সাথে সুনির্দিষ্ট হতে পারে। আপনি GHC এর এ একটি টিকেট খুলতে চান পারে যে ব্যক্তি অনুসরণ করে হিসাবে (সব পরে, অসম্ভব ত্রুটি বার্তা উল্লেখিত হয়নি শুধু ঘটতে)।
মাস্টারমাস্টিক

5
সেই ত্রুটিটি দিয়ে কী চলছে তা আমার কোনও ধারণা নেই তবে কোনও অবস্থাতেই জিএইচসি নির্ভর করে প্রচুর সংস্থান যা আপনি এটি থেকে আড়াল করছেন না PATH=., যেমন প্রিলিওডের জন্য ইন্টারফেস ফাইল এবং এটি ট্রান্সজিটিভ ইমপোর্ট করে এমন সমস্ত কিছুই, যার জন্য প্রকৃত লাইব্রেরি ফাইলগুলি বেস এবং জিএইচসি-প্রাইম এবং পূর্ণসংখ্যা-জিএমপি এবং জিএইচসি settingsফাইল। (মূলত, /usr/lib/ghcআপনার ইনস্টলেশনের জন্য ইনস্টল করা সমস্ত কিছু বা সমতুল্য ডিরেক্টরি))
রিড বার্টন

2
@ মিশেলফক্স স্থিতিশীলভাবে জিএইচসি এপিআইয়ের সাথে সংযোগ স্থাপন করা জিএইচসি 7.8 তে প্রবর্তিত নতুন গতিশীল লিঙ্কারের সাথে কাজ করে না, আমি মনে করি: | (ইন্টারেক্টিভ কোড এক্সিকিউশনটির এখন ডায়নামিক লাইব্রেরি দরকার)
বেনফস

2
@ বেনফাসগুলি দেখে মনে হচ্ছে আপনার মন্তব্যটি প্রায় একটি উত্তর এটি যদি আপনি কিছুটা উচ্চারণ করেন তবে!
sclv

উত্তর:


2

একটি এক্সিকিউটেবলের সাথে শিপিং করা Language.Haskell.Interpreterআপনার প্রদর্শিত পথের সাথে নিখুঁত বলে মনে হচ্ছে। আপনি PATHকার্যকর করতে চান এমন স্ক্রিপ্টটিতে আপনাকে সেট করতে হবে।

এবং পার্শ্ব নোট হিসাবে, মন্তব্যগুলিতে @ বেনফোস দ্বারা উল্লিখিত হিসাবে, স্ট্যাটালি জিএইচসি এপিআই সংযুক্তি জিএইচসি 7.8 তে প্রবর্তিত নতুন গতিশীল লিঙ্কারের সাথে কাজ করে না, (ইন্টারেক্টিভ কোড এক্সিকিউশনটিতে এখন ডায়নামিক লাইব্রেরি প্রয়োজন))

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.