【发布时间】:2018-04-28 06:51:36
【问题描述】:
我想在编译时加载一个(二进制)文件并将其存储在Bytes 类型的顶级变量中:
module FileProvider
import Data.Bits
import Data.Bytes
import Data.Buffer
%default total
export
loadImage : String -> IO (Provider Bytes)
loadImage fileName = do
Right file <- openFile fileName Read
| Left err => pure (Error $ show err)
Just buf <- newBuffer size
| Nothing => pure (Error "allocation failed")
readBufferFromFile file buf size
Provide . dropPrefix 2 . pack <$> bufferData buf
where
size : Int
size = 256 * 256 + 2
它似乎在运行时正常工作:
module Main
import FileProvider
import Data.Bits
import Data.Bytes
main : IO ()
main = do
Provide mem <- loadImage "ram.mem"
| Error err => putStrLn err
printLn $ length mem
但是,如果我尝试在编译时运行它,它会失败并显示一条提到 FFI 的神秘消息:
module Main
import FileProvider
import Data.Bits
import Data.Bytes
%language TypeProviders
%provide (mem : Bytes) with loadImage "ram.mem"
main : IO ()
main = do
printLn $ length mem
$ idris -p bytes -o SOMain SOMain.idr Symbol "idris_newBuffer" not found idris: user error (Could not call foreign function "idris_newBuffer" with args [65538])
这里发生了什么以及如何在编译时加载文件的内容?
【问题讨论】:
标签: ffi compile-time type-providers idris