FFI в Haskell, вопрос о CPP LANGUAGE и как использовать ac struct с FFI - PullRequest
7 голосов
/ 04 мая 2011

У меня есть несколько вопросов о FFI в Haskell

  1. Я знаю, что должен использовать прагму языка {-# LANGUAGE ForeignFunctionInterface #-}, но какая разница, когда я использую {-# LANGUAGE CPP, ForeignFunctionInterface #-}, что я могу сделать "больше" с CPP
  2. я использую функцию в c, которая использует struct, как я могу справиться с этим в FFI?
  3. когда мне нужно использовать CInt и когда просто Int?

Ответы [ 2 ]

6 голосов
/ 04 мая 2011
  1. Если вы включите расширение языка CPP, вы сможете легально включить синтаксис препроцессора С в вашу программу на Haskell.
  2. Получить доступ к структуре немного сложнее.Возможно, самый простой способ - использовать класс типов Storable для определения методов peek и poke для каждого поля структуры.Инструмент hsc2hs может помочь.
  3. Вы используете CInt всякий раз, когда вам нужно передать Haskell Int в или из C, поскольку это обеспечит выполнение любого необходимого маршаллинга (то же самое происходитдля CDouble, CString и т. д.)

В пакете X11 имеется множество примеров определения и упорядочения структур через FFI.


Больше информации в:

3 голосов
/ 04 мая 2011
  1. CPP - препроцессор C. Позволяет использовать условную компиляцию и макросы. Обычно вам это не нужно, но это становится полезным, как только у вас есть зависимый от платформы код, где код для компиляции определяется внешним скриптом (как в случае с autotools).
  2. Посмотрите на c2hs
  3. Используйте Cint только для прямого импорта. При написании высокоуровневой привязки переключитесь на Int, так как пользователю не требуется импортировать необходимые библиотеки, и это стандарт Haskell
...