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 каждый раз, но это уродливое решение.