Как использовать Haskell Ghc API для динамической загрузки исходного кода на Haskell? При импорте какой-то третьей части зависимости - PullRequest
0 голосов
/ 10 января 2019

У меня есть небольшой проект, который генерирует некоторый исходный код в зависимости от аргументов командной строки, а затем выполняет сгенерированный код haskell.

Я пытаюсь использовать GHC API runGhc, чтобы загрузить исходный файл и выполнить его. Я нашел несколько примеров, все файлы исходного кода не импортируют пакеты третьей части.

Но Мой исходный код импортирует некоторые пакеты, и это вызывает Could not find module исключение.

{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE CPP               #-}
{-# LANGUAGE FlexibleContexts  #-}
{-# LANGUAGE LambdaCase        #-}
{-# LANGUAGE MultiWayIf        #-}
{-# LANGUAGE NamedFieldPuns    #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes       #-}
{-# LANGUAGE RecordWildCards   #-}
{-# LANGUAGE TupleSections     #-}
{-# LANGUAGE ViewPatterns      #-}



import GHC
import GHC.Paths ( libdir )
import DynFlags

main =
    defaultErrorHandler defaultFatalMessager defaultFlushOut $ do
      runGhc (Just libdir) $ do
        dflags <- getSessionDynFlags
        setSessionDynFlags $ dflags{
          hscTarget = HscInterpreted
          , ghcLink = LinkInMemory

                                   }
        target <- guessTarget "Demo.hs" Nothing
        setTargets [target]
        load LoadAllTargets

А мой Demo.hs похож на

{-# LANGUAGE DeriveGeneric     #-}
{-# LANGUAGE DataKinds         #-}
{-# LANGUAGE GADTs             #-}
{-# LANGUAGE OverloadedStrings #-}
{-# OPTIONS_GHC -fno-warn-unused-imports #-}
{-# OPTIONS_GHC -fno-warn-name-shadowing #-}
{-# OPTIONS_GHC -fno-warn-unused-matches #-}


module Demo where
import qualified Data.ByteString.Lazy.Internal as BSL
import qualified Data.Aeson as DA

buildRequestFromJson ::
                       BSL.ByteString -> BSL.ByteString -> Maybe EchoRequest
buildRequestFromJson payload = (DA.decode payload)

Ошибка

    Could not find module ‘Data.Aeson’
    Perhaps you meant Data.Version (from base-4.12.0.0)
    Use -v to see a list of the files searched for.
    |
 13 | import qualified Data.Aeson as DA
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Я ищу, как выполнить исходный код. Я не смог использовать hint, plugins пакет. И я хочу знать, как справиться с этим.

...