Cactus
Cactus

Reputation: 27626

Plug new FFI method into GHC

Is there a way to plug a Haskell function of type

myFFI :: (C a) => String -> IO a

(where C is some typeclass describing the types of variables I can import) into GHC as an FFI scheme so that I can write in my Haskell program stuff like

foreign import myFFI "foo" foo :: T1 -> T2

that gets compiled into a call to foo = unsafePerformIO $ myFFI "foo" :: T1 -> T2?

I imagine this could be done by modifying GHC, but is there a way to do it via a plugin I can write without touching the GHC codebase proper?

Upvotes: 7

Views: 178

Answers (2)

sclv
sclv

Reputation: 38893

To answer the question in the comments (since the main question is answered with "use TH"), you can use TH as well to collect a list of all the names you've thus bound. Then, at startup, an init call can walk through that and force them.

Upvotes: 1

Peter
Peter

Reputation: 1474

There is no requirement that the second argument be in the IO monad in the first place.

foreign import ccall sin :: Double -> Double

is perfectly legit, but leads to undefined behavior if sin is impure.

Upvotes: 0

Related Questions