haskell - Haskell inline-c-cpp 调用 Haskell 函数
问题描述
我在一个小例子中使用 inline-c-cpp 来反转字符串:
[C.block| void {
static char strTest[128] = "Hello, Haskell!";
c_func();
} |]
Haskell 代码如下:
reverseIO :: BS.ByteString -> IO BS.ByteString
reverseIO str = return $ BS.reverse str
c_func()
在我调用 的C.include "test.c"
In包含的另一个 c 文件中定义test.c
$fun:(char * (*reverseIO)(char * ))(strTest)
我收到几个错误:
error: use of undeclared identifier 'reverseIO'
$fun:(char (*reverseIO)(char * ))(strTest)
^
任何人都可以帮我解决这个问题吗?
更新:我终于让它使用正确的 C 函数指针语法。
[C.block| void {
c_func($fun:(char* (*reverseIO)(char*)));
} |]
但我仍然有类型问题:
• Couldn't match type ‘BS.ByteString’ with ‘GHC.Ptr.Ptr CChar’
Expected type: GHC.Ptr.Ptr CChar -> IO (GHC.Ptr.Ptr CChar)
Actual type: BS.ByteString -> IO BS.ByteString
解决方案
终于让它工作了:
import Data.Monoid ((<>))
import Foreign.C.String
import qualified Language.C.Inline.Cpp as C
C.context (C.cppCtx <> C.baseCtx <>C.funCtx)
C.include "pageturnerui.cpp"
someFunc :: IO ()
someFunc = do
let reverseIO :: CString -> IO CString
reverseIO cs = peekCString cs >>= return. reverse >>= newCString
[C.block| void {
pageturnerui($fun:(char* (*reverseIO)(char *)));
} |]
在我的 pageturnerui.cpp 中:
int pageturnerui(char* (*foo)(char*))
{
...
static char strTest[128] = "Hello, Haskell!";
if (ImGui::Button("Button")) {
strcpy(strTest, foo(strTest));
}
...
}
PS:我的代码没有说明最佳实践。我没有足够的经验来提供这方面的建议。只是表明它可以编译和工作并且没有崩溃。
推荐阅读
- java - 如何在java类中将n加到x?
- javascript - window.history.pushState 删除“?” 从查询字符串
- pandas - Python从不同目录读取数据并合并到一个excel文件中
- python - 如何执行名称在变量中的批处理文件?
- git - 在不破坏 repo 的情况下重置 repo
- c# - 有没有比 Update() 更高效的方法来检测不经常使用的输入?
- python - 使用 openpyxl 自动读取下一个单元格
- r - 为 R 中的 glm 在不同的家庭上循环
- c# - SendQueryAsync,无响应
- javascript - Javascript继承不起作用,使用原型方法