-- | A Haskell interface to /Mathematica/'s /MathLink/. module Foreign.MathLink ( -- * Basic usage {- | The following is a small Haskell module that exposes a function callable from /Mathematica/ that gets a pair of 'Int's (as a tuple) and returns their sum to /Mathematica/: @ module Main where import 'Foreign.MathLink' addTwo :: 'ML' () addTwo = do (i1,i2) <- 'get' 'put' ((i1 + i2) :: 'Int') main = 'runMathLink' [ 'Function' \{ 'callPattern' = \"AddTwo[i_Integer,j_Integer]\" , 'argumentPattern' = \"{i,j}\" , 'function' = addTwo \} ] @ A function to be exposed to /Mathematica/ has type @'ML' ()@. In its body it uses the 'get' method to receive a value from /Mathematica/, performs the desired computation, and sends the result back to /Mathematica/ via the 'put' function. The types that can be marshaled to\/from /Mathematica/ are instances of the 'Expressible' class. See the @examples@ directory of the source distribution for more. -} -- * Known limitations -- ** No out-of-band messaging {- | So, /e.g./, you cannot abort a calculation. An initial implementation of this was working, but not always reliably, so it was removed, to be added back in a coming revision, hopefully. -} -- ** @'Expressible' 'String'@ needs rewrite rules {- | On Haskell systems without rewrite rules (or when they are not used, as, /e.g./, is the case by default in GHC), the 'Expressible' instance for 'String' is broken. To make sure that the rules always fire with GHC, you can, for instance, include the @OPTIONS_GHC -O@ pragma at the top of your source file. Without using the rewrite rules, two simple workarounds exist. Firstly, if you only need to marshal a single string, you can use the 'getString' and 'putString' functions. More generally, you can marshal the string as a value of type 'Expression' by wrapping it in the 'ExString' constructor. -} -- ** Untested across platforms {- | The author developed the library on a 64-bit Linux platform with GHC 6.10.1 and /Mathematica/ 7. However, among the author's design goals is that the library be useful for: (1) any Haskell system with modest language extensions beyond the 98 standard and implementing the FFI addendum; (2) any version of /Mathematica/ supporting version 3 of the /MathLink/ interface; (3) any 32-bit or 64-bit OS. Please report any failures in this regard, (or, better yet, send a patch!) and the author will make an effort (time, patience, and resources permitting) to bring the library closer to its stated goal, or at least to explicitly document the limitation in a future release. -} module Foreign.MathLink.Types , module Foreign.MathLink.ML , module Foreign.MathLink.Expressible ) where import Foreign.MathLink.Types import Foreign.MathLink.ML import Foreign.MathLink.Expressible