2012-02-24 9 views
3

私はHaskellのLLVMバインディングを使用して、非常に単純な「hello world」スタンドアロンアプリケーションを作成しようとしています。アイデアは、私がHaskellアプリケーションを実行すると、実行可能なバイトコードを吐き出し、 "hello world!"という出力を出すということです。Haskellでllvmバインディングを使用しているときに 'main'関数がモジュールに見つかりません

'main' function not found in module. 

私は明示的にcreateNamedFunctionを使用してmain機能を作成しています:私はこれを実行すると

-- hellofunc prints out "hello world" 
hellofunc :: CodeGenModule (Function (IO())) 


_main :: (Function (IO())) -> CodeGenModule (Function (IO())) 
_main func = createNamedFunction ExternalLinkage "main" $ do 
     call func 
     ret() 

main = writeCodeGenModule "hello.bc" (liftA _main hellofunc) 

は、私は次のエラーを参照してください。私は何が欠けていますか?

+0

「llvm-dis hello.bc」を試して、 '@ main'に何が間違っているのか調べることができます。 – arrowd

+0

_fun2として書き込まれます。 'createNamedFunction'を間違って使用しているのか、その関数にバグがあるのか​​を理解しようとしています。 –

+0

Btw。 "_main"のようなアンダースコアで始まる識別子は未使用の識別子をマークします。 GHCは使用しないと警告しません。したがって、実際には使用されていない場合には、マークだけが未使用として機能します。以下も参照してください:https://ghc.haskell.org/trac/ghc/ticket/4959 – Lemming

答えて

3

=<<ではなく、liftAまたはfmapの使用に問題があります。型シグニチャが使用されるときには、より明白になります(ビルド・ブレイク)。 _mainは、liftAの場合はCodeGenModuleで評価されないため、出力ファイルには表示されません。

CodeGenModule aの代わりにCodeGenModule()を使用するようにwriteCodeGenModuleを変更することは合理的かもしれません。それは、LLVM JITのユーザーにとっては人生をもう少し複雑にしますが、このようなエラーを防ぐのに役立ちます。

import Control.Applicative 
import LLVM.Core 
import LLVM.ExecutionEngine 
import LLVM.Util.File 

-- 
-- hellofunc prints out "hello world" 
hellofunc :: CodeGenModule (Function (IO())) 
hellofunc = createNamedFunction ExternalLinkage "hello" $ do 
    ret() 

_main :: (Function (IO())) -> CodeGenModule (Function (IO())) 
_main func = createNamedFunction ExternalLinkage "main" $ do 
    call func 
    ret() 

generateModuleBind :: CodeGenModule (Function (IO())) 
generateModuleBind = _main =<< hellofunc 

-- Couldn't match expected type `Function (IO())' 
--    with actual type `CodeGenModule (Function (IO()))' 
-- 
-- this is the desired type: 
-- generateModuleLiftA :: CodeGenModule (Function (IO())) 
-- 
-- but this is the actual type: 
generateModuleLiftA :: CodeGenModule (CodeGenModule (Function (IO()))) 
generateModuleLiftA = liftA _main hellofunc 

main :: IO() 
main = writeCodeGenModule "hello.bc" generateModuleBind 
+2

ああ、ありがとう。答えを探している他の人のためのtl; dr:Monadの代わりにApplicativeとして 'CodeGenModule'を使用しました。私は 'liftA'を中置' = << 'に置き換えました。そして今はすべて正常に動作します。 –

関連する問題