小编aco*_*mar的帖子

CPP:Haskell中的宏

我正在使用bindings-DSL来帮助处理FFI声明中的一些样板.但是我发现自己声明了一组相关的函数,这些函数只有几个文本元素不同,我真的宁愿用宏来声明它们.CPP或CPPHS似乎是这个的理想选择,但我在Haskell的上下文中找不到任何使用它的例子.

我已经根据我对C宏的了解将其放入了我期望的工作中:

#define declare_vector_funcs (t, tn, ct) \ 
    #opaque_t vector_##t \
    #ccall create_std_vector##tn , IO (Ptr <vector_##t##>) \
    #ccall carray_to_std_vector##tn , Ptr ct -> CSize -> IO (Ptr <vector_##t##>) \
    #ccall std_vector##tn##_to_carray , Ptr <vector_##t##> -> IO (Ptr ct) \
    #ccall std_vector##tn##_length , Ptr <vector_##t##> -> IO CSize
Run Code Online (Sandbox Code Playgroud)

本质上,我想在扩展这个宏时定义一个外来(不透明)类型和4个外来函数.但是,这不起作用,因为它将参数列表后面的所有内容读作GHC编译指示,并且失败.

我已经尝试了几次不同的迭代,例如弄乱间距并将所有内容放在一行(用括号括起来区分不同的宏调用).

我怎样才能解决这个问题?删除绑定的答案 - DSL使用有利于直接翻译很好,但我绝对不想手动写出所有这些.

我也非常感谢这种CPP使用的一些例子.

如果我删除宏名称和参数列表之间的空格,这是我得到的错误消息:

CPP.hsc:13:39: error: '#' is not followed by a macro parameter
compiling dist/build/Foreign/CPP_hsc_make.c failed (exit code 1)
command was: /usr/bin/g++ -c dist/build/Foreign/CPP_hsc_make.c -o dist/build/Foreign/CPP_hsc_make.o -fno-stack-protector -D__GLASGOW_HASKELL__=708 …
Run Code Online (Sandbox Code Playgroud)

haskell ffi

6
推荐指数
1
解决办法
662
查看次数

标签 统计

ffi ×1

haskell ×1