Для этой задачи hsc2hs ваш друг.
Для простого примера давайте получим значение INT_MAX
из limits.h
.
$ cat >IntMax.hsc
module Main where
#include <limits.h>
c_INT_MAX = #const INT_MAX
main = print c_INT_MAX
С помощью hsc2hs мы можем * заголовки #include
и использовать значения констант с директивой #const
.
Вместо того, чтобы строить вручную, используйте Cabal:
$ cat >intmax.cabal
Name: intmax
Version: 0.0
Cabal-Version: >=1.2
Build-Type: Simple
Executable intmax
Main-Is: IntMax.hs
Build-Depends: base
Обратите внимание, что хотя имя основной программы IntMax.hsc
, строка Main-Is
указывает на IntMax.hs
. Когда Кабал ищет IntMax.hs
, но находит IntMax.hsc
, он автоматически передает его через hsc2hs как часть сборки.
$ cabal configure
Resolving dependencies...
Configuring intmax-0.0...
$ cabal build
Prerocessing executables for intmax-0.0...
Building intmax-0.0...
[1 of 1] Compiling Main ( dist\build\intmax\intmax-tmp\IntMax.hs, dist\build\intmax\intmax-tmp\Main.o )
Linking dist\build\intmax\intmax.exe ...
$ ./dist/build/intmax/intmax
2147483647
Обратите внимание, что вам нужно разбить строки на несколько констант. Допустим, вы собираете битовое поле для передачи FormatMessage . Вы хотите написать это как
flags = #const FORMAT_MESSAGE_FROM_SYSTEM
.|.
#const FORMAT_MESSAGE_IGNORE_INSERTS
Размещение их всех в одну строку приведет к синтаксическим ошибкам.