Haskell GHC Dynamic Compliation работает только при первой компиляции

Следуя опубликованному здесь руководству по GHC и изменениям в этом коде, следуя советам из предыдущего вопроса о переполнении стека, я создал программу, которая может компилировать и запускать модуль в Test.hs с функцией print для печати строки в экран:

import GHC
import GHC.Paths
import DynFlags
import Unsafe.Coerce

main :: IO ()
main =
    defaultErrorHandler defaultLogAction $ do
      func <- runGhc (Just libdir) $ do
        dflags <- getSessionDynFlags
        setSessionDynFlags dflags
        target <- guessTarget "Test.hs" Nothing
        addTarget target
        r <- load LoadAllTargets
        case r of
          Failed -> error "Compilation failed"
          Succeeded -> do
            m <- findModule (mkModuleName "Test") Nothing
            setContext [IIModule m]
            value <- compileExpr ("Test.print")
            do let value' = (unsafeCoerce value) :: String -> IO ()
               return value'
      func "Hello"
      return ()

Проблема с этим кодом, как отмечается в комментариях, заключается в том, что он работает только при первом запуске (когда Test.hs еще не был выполнен). Если вы попытаетесь запустить код во второй раз, появится следующая ошибка:

mkTopLevEnv: not interpreted main:Test

Я считаю, что это как-то связано с тем, что код уже скомпилирован. Если я удаляю файлы.hi и.o и снова запускаю программу, программа работает правильно с правильным выводом. Что мне не хватает? В настоящее время я использую GHC версии 7.4.1

(Примечание: я попытался просмотреть API GHC, но не смог найти никаких ссылок на mkTopLevEnv)

1 ответ

Саймон Марлоу предлагает здесь заменить

guessTarget "Test.hs" Nothing

с

guessTarget "*Test.hs" Nothing

следует избегать получаемой ошибки, поскольку она сообщает GHC не загружать файл.o.

Посмотреть всю ветку на странице через Набб

Конечно, вы можете удалять файлы.hi и.o каждый раз, но это уродливое решение.

Другие вопросы по тегам