Кстати, ваша мотивация кажется ошибочной.Я не думаю, что есть какая-то польза от цикла событий C, единственной целью которого является «форсировать оценку» по регулярному графику.Вы можете сделать это в Хаскеле просто отлично.
В вашем примере, что идет не так, вероятно, Lib
в ghc-options
.Однако есть другие поля Cabal, которые вы должны использовать вместо этого, что сделает работу более плавной.
Вот как получить минимальный пример работы со стеком.Создайте новый каталог с четырьмя файлами, перечисленными ниже, и запустите stack build
, затем stack exec c-loop-exe
.
Несколько пунктов:
- Вы можете сделать это с помощью
package.yaml
файла, но вам придется преобразовать синтаксис Cabal в *. 1015 * - Вам больше не нужен весь этот мусор
__stginit
и hs_add_root
, если только вы не используете GHC <7.2. </li> - Вам не нужно жестко кодировать путь для заглушки, если вы правильно настроили файл Cabal (т. Е., Используя
c-sources
). - Флаг
-opt-O2
не нужен.Это стек по умолчанию.
Содержимое четырех файлов:
-- stack.yaml
resolver: lts-13.21
packages:
- .
-- c-loop.cabal
cabal-version: 1.12
name: c-loop
version: 0.1.0.0
build-type: Simple
executable c-loop-exe
main-is: src/Lib.hs
ghc-options: -no-hs-main
c-sources: c/eventLoop.c
build-depends:
base >=4.7 && <5
default-language: Haskell2010
-- c/eventLoop.c
#include <stdio.h>
#include <time.h>
#include "HsFFI.h"
#include "Lib_stub.h"
int main(int argc, char *argv[])
{
int i;
hs_init(&argc, &argv);
for (int m = 0; m < 10; ++m) {
i = fibonacci_hs(42);
printf("Fibonacci: %d\n", i);
}
hs_exit();
return 0;
}
-- src/Lib.hs
{-# LANGUAGE ForeignFunctionInterface #-}
module Lib where
import Foreign.C.Types
fibonacci :: Int -> Int
fibonacci n = fibs !! n
where fibs = 0 : 1 : zipWith (+) fibs (tail fibs)
fibonacci_hs :: CInt -> CInt
fibonacci_hs = fromIntegral . fibonacci . fromIntegral
foreign export ccall fibonacci_hs :: CInt -> CInt