Green Card and Exceptions

Matthew Donadio
Thu, 12 Jun 2003 22:37:25 -0400

Hi all,

I have a couple of questions about Green Card and exceptions.

I am interfaceing to the GSL to get access to a few functions, and
eventually interface all of the special functions to Haskell.  And
unlike my DSP library, and am trying to get it right the first time. :)

Below is a Green Card interface to one of the functions.

%fun airy_Ai_e :: Double -> (Double, Double)
%call (double x)
%code int rc;
%     double val;
%     double err;
%     gsl_sf_result result;
%     rc = gsl_sf_airy_Ai_e(x, GSL_PREC_DOUBLE, &result);
%     val = result.val;
%     err = result.err;
%result (double val, double err)

This definition works, but it ignores the return code from the library
function.  The various return codes are from an enum defined in a header
file.  I would like to throw a Haskell exception (one of the
ArithExceptions defined in Control.Exception) depending on the value of

Do I need to create a new DIS for the return values (which are an enum
defined in a header), change the function to return a triplet
(var,err,rc), and then throw the exception in Haskell land?  Is there a
way I can do this directly from the GC interface?  If I have to create a
DIS, can this be shared across several modules that all need the same


Matthew Donadio (