@@ -21,7 +21,7 @@ import Paths_idris
21import Epic.Epic hiding (Term, Type, Name, fn, compile)
21import Epic.Epic hiding (Term, Type, Name, fn, compile)
22import qualified Epic.Epic as E
22import qualified Epic.Epic as E
24−primDefs = [UN "mkForeign", UN "FalseElim"]
24+primDefs = [UN "mkLazyForeign", UN "mkForeign", UN "FalseElim"]
26compile :: FilePath -> Term -> Idris ()
26compile :: FilePath -> Term -> Idris ()
27compile f tm
27compile f tm
@@ -102,7 +102,9 @@ instance ToEpic (TT Name) where
102 epic tm = epic' [] tm where
102 epic tm = epic' [] tm where
103 epic' env tm@(App f a)
103 epic' env tm@(App f a)
104 | (P _ (UN "mkForeign") _, args) <- unApply tm
104 | (P _ (UN "mkForeign") _, args) <- unApply tm
105− = doForeign args
105+ = doForeign False args
106+ | (P _ (UN "mkLazyForeign") _, args) <- unApply tm
107+ = doForeign True args
106 | (P _ (UN "lazy") _, [_,arg]) <- unApply tm
108 | (P _ (UN "lazy") _, [_,arg]) <- unApply tm
107 = do arg' <- epic' env arg
109 = do arg' <- epic' env arg
108 return $ lazy_ arg'
110 return $ lazy_ arg'
@@ -155,15 +157,17 @@ instance ToEpic (TT Name) where
155 buildApp env (e @@ x') xs
157 buildApp env (e @@ x') xs
158−doForeign :: [TT Name] -> Idris E.Term
160+doForeign :: Bool -> [TT Name] -> Idris E.Term
159−doForeign (_ : fgn : args)
161+doForeign lazy (_ : fgn : args)
160 | (_, (Constant (Str fgnName) : fgnArgTys : ret : [])) <- unApply fgn
162 | (_, (Constant (Str fgnName) : fgnArgTys : ret : [])) <- unApply fgn
161 = let tys = getFTypes fgnArgTys
163 = let tys = getFTypes fgnArgTys
162 rty = mkEty' ret in
164 rty = mkEty' ret in
163 do args' <- mapM epic args
165 do args' <- mapM epic args
164 -- wrap it in a prim__IO
166 -- wrap it in a prim__IO
165 -- return $ con_ 0 @@ impossible @@
167 -- return $ con_ 0 @@ impossible @@
169+ then return $ lazy_ $ foreignL_ rty fgnName (zip args' tys)
166− return $ lazy_ $ foreign_ rty fgnName (zip args' tys)
170+ else return $ lazy_ $ foreign_ rty fgnName (zip args' tys)
167 | otherwise = fail "Badly formed foreign function call"
171 | otherwise = fail "Badly formed foreign function call"
169getFTypes :: TT Name -> [E.Type]
173getFTypes :: TT Name -> [E.Type]