2013-01-09 2 views
3

큰 대학 프로젝트의 작은 부분으로서, 본질적으로 매우 조잡한 IDE 인 것을 써야합니다. 아이디어는 gtk 텍스트 상자에서 입력을 가져 와서 해당 .hs 파일에있는 것처럼 처리하고 그 안에있는 함수를 평가하는 것입니다.문자열을 하스켈 프로그램으로 처리하기

내 주요 접근 방식은 GHC API을 사용하여 테스트 기능을 컴파일하고 평가하는 것이 었습니다. 나는 이미 .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과 같은 것을 사용하여 텍스트 상자의 텍스트를 평가하는 것입니다. 단일 함수를 단독으로 평가하려는 경우이 함수는 정상적으로 작동하지만 동일한 소스 파일 내에서 정의 된 다른 네 함수를 실행하는 컨텍스트에 의존하는 함수를 평가하려는 경우이 배율을 사용할 수 있습니까?

+1

https://github.com/shapr/ghclive에서 ghclive를보고 싶을 수도 있습니다. – Satvik

+3

실제로 '힌트'를 자세히 보았습니까? 표현 평가자 일뿐 만 아니라 모듈 로딩과 모든 것을 포함한 GHCi에 더 가깝습니다. –

+1

또 다른 Stackoverflow에 따르면, [어떻게 "패닉 불가능한 일들"...] (http://stackoverflow.com/questions/9242996/how-to-handle-panic-the-impossible-happened-and-continue -in-haskell) 질문에 버그를보고해야합니다. 질문, 상자에 무엇이 있는지 간단히 평가하려고합니까 아니면 ghcMonad에서 가져 오려고합니까? – Davorak

답변

4

C.A. 맥캔 (McCann)은 hint이 당신에게 많은 도움이된다고 말합니다. 그것은 mueval과 같은 독립 실행 형 평가자가 아니라 GHC API를 둘러싼 래퍼입니다.

필요한 항목이 누락 된 경우에도 처음부터 시작하는 것보다 학습하고 확장하는 것이 훨씬 쉽습니다.