Подтвердить что ты не робот

Динамическая загрузка под GHCi

Мне нужно динамически загружать модули Haskell и оценивать выражения в контексте динамически загружаемых модулей.

Hint делает это; проблема в том, что она не работает под GHCi, по крайней мере на Windows.

cygwin-bash> ghci HintTest.hs
GHCi, version 7.6.3: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Ok, modules loaded: Main.
Prelude Main>
Prelude Main> main
[... lots of "Loading package" messages snipped]

GHCi runtime linker: fatal error: I found a duplicate definition for symbol
   _debugLn
whilst processing object file
   C:\PROGRAM FILES (X86)\HASKELL PLATFORM\2013.2.0.0\lib\ghc-prim-0.3.0.0\HSghc-prim-0.3.0.0.o
This could be caused by:
   * Loading two different object files which export the same symbol
   * Specifying the same object file twice on the GHCi command line
   * An incorrect `package.conf' entry, causing some object to be
     loaded twice.
GHCi cannot safely continue in this situation.  Exiting now.  Sorry.

Я получаю ту же ошибку при непосредственном использовании модулей GHC, как показано в GHC/Как библиотека.

Как скомпилированная программа, HintTest работает отлично.

Есть ли что-нибудь, что можно сделать по этому поводу?

Мне не нужно запускать мою программу автономно; всегда с использованием GHCi. Было бы неплохо, если бы программа могла использовать GHCi как интерпретатор, а не собственную копию GHC. То есть, я хотел бы сделать что-то вроде этого:

do
  context <- loadToGhci "MyModule.hs"
  inContext context "MyModule.myFunction 2 5"

и когда я вернусь к REPL, MyModule магически загрузится к нему. context означает какую-то монаду, несущую состояние GHCi.

Обновление Тот же код работает в Linux. Возможно, это ошибка Windows в GHC. Может ли это работать?

Обновление 2 Здесь полный журнал

Prelude Main> main
Loading package array-0.4.0.1 ... linking ... done.
Loading package deepseq-1.3.0.1 ... linking ... done.
Loading package bytestring-0.10.0.2 ... linking ... done.
Loading package Win32-2.3.0.0 ... linking ... done.
Loading package transformers-0.3.0.0 ... linking ... done.
Loading package old-locale-1.0.0.5 ... linking ... done.
Loading package time-1.4.0.1 ... linking ... done.
Loading package syb-0.4.0 ... linking ... done.
Loading package random-1.0.1.1 ... linking ... done.
Loading package filepath-1.3.0.1 ... linking ... done.
Loading package directory-1.2.0.1 ... linking ... done.
Loading package process-1.1.0.2 ... linking ... done.
Loading package pretty-1.1.1.0 ... linking ... done.
Loading package mtl-2.1.2 ... linking ... done.
Loading package containers-0.5.0.0 ... linking ... done.
Loading package hpc-0.6.0.0 ... linking ... done.
Loading package hoopl-3.9.0.0 ... linking ... done.
Loading package haskell-src-1.0.1.5 ... linking ... done.
Loading package old-time-1.1.0.1 ... linking ... done.
Loading package Cabal-1.16.0 ... linking ... done.
Loading package binary-0.5.1.1 ... linking ... done.
Loading package bin-package-db-0.0.0.0 ... linking ... done.
Loading package template-haskell ... linking ... done.
Loading package ghc-7.6.3 ... linking ... done.
Loading package extensible-exceptions-0.1.1.4 ... linking ... done.
Loading package MonadCatchIO-mtl-0.3.0.5 ... linking ... done.
Loading package ghc-mtl-1.0.1.2 ... linking ... done.
Loading package ghc-paths-0.1.0.9 ... linking ... done.
Loading package utf8-string-0.3.7 ... linking ... done.
Loading package hint-0.3.3.7 ... linking ... done.


GHCi runtime linker: fatal error: I found a duplicate definition for symbol
   _debugLn
whilst processing object file
   C:\PROGRAM FILES (X86)\HASKELL PLATFORM\2013.2.0.0\lib\ghc-prim-0.3.0.0\HSghc-prim-0.3.0.0.o
This could be caused by:
   * Loading two different object files which export the same symbol
   * Specifying the same object file twice on the GHCi command line
   * An incorrect `package.conf' entry, causing some object to be
     loaded twice.
GHCi cannot safely continue in this situation.  Exiting now.  Sorry.
4b9b3361

Ответ 1

Вы пытаетесь динамически загружать интерпретатор байт-кода и время выполнения в интерпретатор байт-кода и время выполнения. Будет ли это работать, будет зависеть от того, как основные библиотеки C связаны с вашей системой, что очень зависит от платформы.

В частности, символы C будут дублироваться, если при связывании не будет особого внимания при загрузке различных модулей RTS во второй раз, что приведет к ошибкам компоновщика.