On 08 October 2004 19:18, Sven Panne wrote:
Jules Bean wrote:
[...] Unfortunately, it's not going to work. It's not going to work because some of the procedures take callbacks, and the callbacks are values of type IO (). I can see two solutions to this:
a) revert to using an IORef [...] b) write the callbacks as values of type StateT Env IO () [...]
or
c) Give up any hope of clean semantics and simply use a common hack like:
{-# NOINLINE myGlobalVar #-} myGlobalVar :: IORef Int myGlobalVar = unsafePerformIO (newIORef 0)
My GLUT binding does it happily, as does GHC itself, [snip]
I'd like to add that while the implementation might be a little unsafe, there's no problem in principle with the semantics of top-level IORefs. We could add such a thing as a GHC extension, but it would be nice if it were an instance of a more general-purpose extension. Cheers, Simon