mirror of https://github.com/voidlizard/hbs2
wip, fixed excess evaluation
This commit is contained in:
parent
dae0aa191a
commit
661fe8135b
|
@ -372,6 +372,7 @@ instance Exception BadValueException
|
||||||
|
|
||||||
type Dict c m = HashMap Id (Bind c m)
|
type Dict c m = HashMap Id (Bind c m)
|
||||||
|
|
||||||
|
|
||||||
newtype RunM c m a = RunM { fromRunM :: ReaderT (TVar (Dict c m)) m a }
|
newtype RunM c m a = RunM { fromRunM :: ReaderT (TVar (Dict c m)) m a }
|
||||||
deriving newtype ( Applicative
|
deriving newtype ( Applicative
|
||||||
, Functor
|
, Functor
|
||||||
|
@ -469,6 +470,18 @@ splitForms s0 = runIdentity $ S.toList_ (go mempty s0)
|
||||||
|
|
||||||
emit = S.yield . reverse
|
emit = S.yield . reverse
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
evargs :: forall c m . ( IsContext c
|
||||||
|
, MonadUnliftIO m
|
||||||
|
, Exception (BadFormException c)
|
||||||
|
)
|
||||||
|
=> Dict c m
|
||||||
|
-> [Syntax c]
|
||||||
|
-> RunM c m [Syntax c]
|
||||||
|
|
||||||
|
evargs dict = mapM (eval' dict)
|
||||||
|
|
||||||
applyLambda :: forall c m . ( IsContext c
|
applyLambda :: forall c m . ( IsContext c
|
||||||
, MonadUnliftIO m
|
, MonadUnliftIO m
|
||||||
, Exception (BadFormException c)
|
, Exception (BadFormException c)
|
||||||
|
@ -477,12 +490,11 @@ applyLambda :: forall c m . ( IsContext c
|
||||||
-> Syntax c
|
-> Syntax c
|
||||||
-> [Syntax c]
|
-> [Syntax c]
|
||||||
-> RunM c m (Syntax c)
|
-> RunM c m (Syntax c)
|
||||||
applyLambda decl body args = do
|
applyLambda decl body ev = do
|
||||||
|
|
||||||
when (length decl /= length args) do
|
when (length decl /= length ev) do
|
||||||
throwIO (ArityMismatch @c nil)
|
throwIO (ArityMismatch @c nil)
|
||||||
|
|
||||||
ev <- mapM eval args
|
|
||||||
tv <- ask
|
tv <- ask
|
||||||
d0 <- readTVarIO tv
|
d0 <- readTVarIO tv
|
||||||
|
|
||||||
|
@ -531,8 +543,7 @@ apply name args' = do
|
||||||
|
|
||||||
case bindAction <$> what of
|
case bindAction <$> what of
|
||||||
Just (BindLambda e) -> do
|
Just (BindLambda e) -> do
|
||||||
liftIO $ print $ show $ pretty "APPLY!" <+> pretty name <+> pretty args'
|
e args'
|
||||||
mapM eval args' >>= e
|
|
||||||
|
|
||||||
Just (BindValue (Lambda argz body) ) -> do
|
Just (BindValue (Lambda argz body) ) -> do
|
||||||
applyLambda argz body args'
|
applyLambda argz body args'
|
||||||
|
@ -602,13 +613,14 @@ eval :: forall c m . ( IsContext c
|
||||||
-> RunM c m (Syntax c)
|
-> RunM c m (Syntax c)
|
||||||
eval = eval' mempty
|
eval = eval' mempty
|
||||||
|
|
||||||
|
|
||||||
eval' :: forall c m . ( IsContext c
|
eval' :: forall c m . ( IsContext c
|
||||||
, MonadUnliftIO m
|
, MonadUnliftIO m
|
||||||
, Exception (BadFormException c)
|
, Exception (BadFormException c)
|
||||||
) => Dict c m
|
) => Dict c m
|
||||||
-> Syntax c
|
-> Syntax c
|
||||||
-> RunM c m (Syntax c)
|
-> RunM c m (Syntax c)
|
||||||
eval' dict0 syn = handle (handleForm syn) $ do
|
eval' dict0 syn' = handle (handleForm syn') $ do
|
||||||
|
|
||||||
dict1 <- ask >>= readTVarIO
|
dict1 <- ask >>= readTVarIO
|
||||||
|
|
||||||
|
@ -616,7 +628,7 @@ eval' dict0 syn = handle (handleForm syn) $ do
|
||||||
|
|
||||||
-- liftIO $ print $ show $ "TRACE EXP" <+> pretty syn
|
-- liftIO $ print $ show $ "TRACE EXP" <+> pretty syn
|
||||||
|
|
||||||
case syn of
|
case syn' of
|
||||||
|
|
||||||
SymbolVal (Id s) | Text.isPrefixOf ":" s -> do
|
SymbolVal (Id s) | Text.isPrefixOf ":" s -> do
|
||||||
pure (mkSym @c (Text.drop 1 s))
|
pure (mkSym @c (Text.drop 1 s))
|
||||||
|
@ -693,14 +705,14 @@ eval' dict0 syn = handle (handleForm syn) $ do
|
||||||
-- evalTop what
|
-- evalTop what
|
||||||
|
|
||||||
lc@(ListVal (Lambda decl body : args)) -> do
|
lc@(ListVal (Lambda decl body : args)) -> do
|
||||||
applyLambda decl body args
|
applyLambda decl body =<< evargs dict args
|
||||||
|
|
||||||
ListVal (SymbolVal name : args') -> do
|
ListVal (SymbolVal name : args') -> do
|
||||||
apply name args'
|
apply name =<< evargs dict args'
|
||||||
|
|
||||||
ListVal (e' : args') -> do
|
ListVal (e' : args') -> do
|
||||||
-- e <- eval e'
|
-- e <- eval e'
|
||||||
apply_ e' args'
|
apply_ e' =<< evargs dict args'
|
||||||
|
|
||||||
SymbolVal name | HM.member name dict -> do
|
SymbolVal name | HM.member name dict -> do
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue