Рассмотрение последовательности как программа Хаскелла

Как небольшая часть большего Университетского проекта, я должен написать то, что является по существу чрезвычайно сырым IDE. Идея состоит в том, чтобы быть взять вход от gtk текстового окна, удовольствие, которые натягивают, как будто это находится в .hs файле, и оценивают функцию в нем.

Мой главный подход должен был использовать API GHC собрать и оценить испытательную функцию. Мне уже удалось получить игрушечный пример, работающий на компилирование от .hs файла. У Целевого типа данных GHC был дополнительный конструктор для получения цели от StringBuffer, таким образом, я решил попытаться изменить мой код, чтобы заставить его работать от Буфера Последовательности:

compileText :: SourceView -> IO ()
compileText tview = do

txtBuff <- textViewGetBuffer tview
startIt <- textBufferGetStartIter txtBuff
endIt <- textBufferGetEndIter txtBuff
compTime <- getClockTime
srcString <- textBufferGetText txtBuff startIt endIt False


defaultErrorHandler defaultLogAction $ do
  func <- runGhc (Just libdir) $ do
    dflags <- getSessionDynFlags
    setSessionDynFlags dflags
    addTarget $ haskellFileFromText srcString compTime
    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 ()

haskellFileFromText :: String -> ClockTime -> GHC.Target
haskellFileFromText codeStr cTime = GHC.Target (TargetModule (mkModuleName "Test")) False (Just ((stringToStringBuffer codeStr), cTime))

Следующий код, находящийся в текстовом окне в то время:

module Test (Test.print) where

print :: String -> IO ()
print x = putStrLn x 

Однако это, кажется, не работает. Я получаю ошибку:

textEdit: panic! (the 'impossible' happened)
  (GHC version 7.4.1 for x86_64-unknown-linux):
    Could not find module `Test'
Use -v to see a list of the files searched for.


Please report this as a GHC bug:  http://www.haskell.org/ghc/reportabug

Что я делаю неправильно? Я чувствую, что кардинально неправильно понимаю что-то о способе, которым работает этот код.

Альтернатива этому методу, который был предложен мне, должна использовать что-то как намек или mueval, чтобы оценить текст в textbox. Это, казалось бы, хорошо работало бы, если бы я просто хочу оценить единственную функцию в изоляции, но это измерило бы, если бы я хотел оценить функцию, которая зависела от контекста управления 4 другими функциями, определяемыми в том же самом исходном файле?

3
nl ja de
Вы на самом деле посмотрели на намек подробно? It' s не только оценщик выражения - it' s ближе к GHCi, с погрузкой модуля и всем.
добавлено автор C. A. McCann, источник
Вы могли бы хотеть посмотреть на ghclive в github.com/shapr/ghclive
добавлено автор Satvik, источник
По данным другого Stackoverflow, Как Обращаться "с паникой, невозможное произошло"... вопрос необходимо сообщать об ошибке. Вопрос, вы пытаетесь просто оценить то, что находится в коробке, или вы пытаетесь вывести его из ghcMonad?
добавлено автор Davorak, источник

1 ответы

Как К.А. МакКанн отмечает, , намек делает большую эту работу для вас. Это - обертка вокруг API GHC, не только автономный оценщик как mueval.

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

4
добавлено
Haskell
Haskell
910 участник(ов)

https://combot.org/chat/-1001043143583 Ссылки на полезные ресурсы: https://ruhaskell.org/links.html ;