API for computing the Haskell binding

This commit is contained in:
krasimir
2017-01-26 18:41:07 +00:00
parent 22c10a1a27
commit 4fae6e89a3
2 changed files with 21 additions and 0 deletions

View File

@@ -45,6 +45,9 @@ module PGF2 (-- * PGF
-- ** Type checking
checkExpr, inferExpr, checkType,
-- ** Computing
compute,
-- * Concrete syntax
ConcName,Concr,languages,
-- ** Linearization
@@ -279,6 +282,22 @@ checkType (PGF p _) (Type c_ty _) =
then return (Left msg)
else throwIO (PGFError msg)
compute :: PGF -> Expr -> Expr
compute (PGF p _) (Expr c_expr _) =
unsafePerformIO $
withGuPool $ \tmpPl -> do
exn <- gu_new_exn tmpPl
exprPl <- gu_new_pool
c_expr <- pgf_compute p c_expr exn tmpPl exprPl
status <- gu_exn_is_raised exn
if not status
then do exprFPl <- newForeignPtr gu_pool_finalizer exprPl
return (Expr c_expr exprFPl)
else do c_msg <- (#peek GuExn, data.data) exn
msg <- peekUtf8CString c_msg
gu_pool_free exprPl
throwIO (PGFError msg)
-----------------------------------------------------------------------------
-- Graphviz

View File

@@ -301,6 +301,8 @@ foreign import ccall "pgf/expr.h pgf_infer_expr"
foreign import ccall "pgf/expr.h pgf_check_type"
pgf_check_type :: Ptr PgfPGF -> Ptr PgfType -> Ptr GuExn -> Ptr GuPool -> IO ()
foreign import ccall "pgf/expr.h pgf_compute"
pgf_compute :: Ptr PgfPGF -> PgfExpr -> Ptr GuExn -> Ptr GuPool -> Ptr GuPool -> IO PgfExpr
foreign import ccall "pgf/expr.h pgf_print_expr"
pgf_print_expr :: PgfExpr -> Ptr PgfPrintContext -> CInt -> Ptr GuOut -> Ptr GuExn -> IO ()