Здравствуйте, alexander.vladislav.popov, Вы писали:
AVP>Привет, RSDN.
AVP>Будь добр, помоги пожалуйста с FFI Haskell (GHC), если у тебя есть возможность.
AVP>Проблема в следующем: я умею в Хаскеле генерить строки по заданному регексу — генексы. Получаю ленивый список строк, который, в принципе, может быть бесконечным. Этот список строк хотелось бы использовать в программе на C. Поэтому хотелось передать в C вычисление, сделанное на Хаскеле, и итеративно отъедать от него строки по мере надобности. Прочитал кучу документации по FFI, но все равно ни как не могу сообразить. Написал в Хаскель-бегинерс, но тоже не дали ответ. Может быть ты поможешь?
AVP>Хотелось бы следующего:
AVP>AVP>COMPUTATION c = open("rege\x");
AVP>while(need_next()) {
AVP> printf(next( c ));
AVP>}
AVP>close( c );
AVP>
AVP>С уважением, Александр.
Что именно вызывает проблемы?
Экспортируйте функции (пишу на память, могу соврать, лучше точнее посмотреть в доках)
foreign export ccall open :: CString -> IO (Ptr ())
foreign export ccall need_next :: Ptr () -> IO Bool
foreign export ccall next :: Ptr () -> IO CString
В Ptr () запихиваете любые Haskell-данные, получив из них StablePtr a и закастив к Ptr ().
Строки конвертируете через newCString, peekCString, peekCString.
Придётся, правда, позаботиться об освобождении самому, написав какую-нибудь close, а строки не самому выделять, а получать и заполнять буффер.
Всё, что нужно, можно смотреть
здесь в модулях Foreign.