mathlink-2.0.1.1: example/Test.hs
-- See the README file for an example session.
module Main where
import Foreign.MathLink
addFour :: (Int,Int,Int,Int) -> ML Int
addFour (a,b,c,d) = return $ a+b+c+d
-- Note that functions to be exposed need to be uncurried.
ackermann :: (Integer,Integer) -> ML Integer
ackermann (m,n) = return $ ack m n
ack :: Integer -> Integer -> Integer
ack 0 n = n + 1
ack 1 n = n + 2
ack 2 n = 2 * n + 3
ack m 0 = ack (m-1) 1
ack m n = ack (m-1) (ack m (n-1))
decl :: MLSpec
decl =
[ Eval $ (Sy "BeginPackage"):@[St "Test`"]
, DeclMsg "AddFour" "usage"
"AddFour[a,b,c,d] returns the sum of a, b, c, and d."
, DeclMsg "Ackermann" "usage"
"Ackermann[m,n]: the Ackermann function."
, Eval $ (Sy "Begin"):@[St "`Private`"]
, DeclFn {
callPattern = "AddFour[a_Integer,b_Integer,c_Integer,d_Integer]"
, argPattern = "{a,b,c,d}"
, func = addFour
}
, DeclFn {
callPattern = "Ackermann[i_Integer,j_Integer]"
, argPattern = "{i,j}"
, func = ackermann
}
, Eval $ (Sy "End"):@[]
, Eval $ (Sy "EndPackage"):@[]
]
main :: IO ()
main = runMLSpec decl