我正在使用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)