From 9fe7985b2dc9f7d75783141e45e76c6b40148b4c Mon Sep 17 00:00:00 2001 From: Jan Mas Rovira Date: Fri, 26 Jan 2024 12:58:34 +0100 Subject: [PATCH] fix evaluation of OpIsCell --- src/Juvix/Compiler/Nockma/Evaluator.hs | 12 +++++++----- src/Juvix/Compiler/Nockma/Translation/FromAsm.hs | 6 +----- test/Nockma/Eval/Positive.hs | 4 ++-- 3 files changed, 10 insertions(+), 12 deletions(-) diff --git a/src/Juvix/Compiler/Nockma/Evaluator.hs b/src/Juvix/Compiler/Nockma/Evaluator.hs index ab42737545..c2449ef5b3 100644 --- a/src/Juvix/Compiler/Nockma/Evaluator.hs +++ b/src/Juvix/Compiler/Nockma/Evaluator.hs @@ -200,7 +200,7 @@ eval inistack initerm = OpAddress -> goOpAddress OpQuote -> return goOpQuote OpApply -> goOpApply - OpIsCell -> return goOpIsCell + OpIsCell -> goOpIsCell OpInc -> goOpInc OpEq -> goOpEq OpIf -> goOpIf @@ -231,10 +231,12 @@ eval inistack initerm = goOpQuote :: Term a goOpQuote = c ^. operatorCellTerm - goOpIsCell :: Term a - goOpIsCell = TermAtom $ case c ^. operatorCellTerm of - TermCell {} -> nockTrue - TermAtom {} -> nockFalse + goOpIsCell :: Sem r (Term a) + goOpIsCell = do + cr <- evalArg crumbEvalFirst stack (c ^. operatorCellTerm) + return . TermAtom $ case cr of + TermCell {} -> nockTrue + TermAtom {} -> nockFalse goOpTrace :: Sem r (Term a) goOpTrace = do diff --git a/src/Juvix/Compiler/Nockma/Translation/FromAsm.hs b/src/Juvix/Compiler/Nockma/Translation/FromAsm.hs index d5a24e6007..f553c13d8c 100644 --- a/src/Juvix/Compiler/Nockma/Translation/FromAsm.hs +++ b/src/Juvix/Compiler/Nockma/Translation/FromAsm.hs @@ -758,10 +758,6 @@ replaceSubterm obj relPath newVal = OpReplace # (relPath # newVal) # obj evaluated :: Term Natural -> Term Natural evaluated t = OpApply # (OpAddress # emptyPath) # t --- | The IsCell op but the argument is evaluated first. -isCell' :: Term Natural -> Term Natural -isCell' t = evaluated $ (OpQuote # OpIsCell) # t - -- | The same as replaceSubterm but the path is a cell that is evaluated. -- i.e. replaceSubterm a p b = replaceSubterm' a (quote p) b replaceSubterm' :: Term Natural -> Term Natural -> Term Natural -> Term Natural @@ -989,7 +985,7 @@ caseCmd defaultBranch = \case goRepList :: NonEmpty (NockmaMemRepListConstr, Sem r ()) -> Sem r () goRepList ((c, b) :| bs) = do - push (isCell' (OpAddress # topOfStack ValueStack)) + push (OpIsCell # (OpAddress # topOfStack ValueStack)) let otherBranch = fromJust (firstJust f bs <|> defaultBranch) case c of NockmaMemRepListConstrCons -> branch b otherBranch diff --git a/test/Nockma/Eval/Positive.hs b/test/Nockma/Eval/Positive.hs index 25001a9bab..ec03e7e506 100644 --- a/test/Nockma/Eval/Positive.hs +++ b/test/Nockma/Eval/Positive.hs @@ -57,8 +57,8 @@ tests = Test "address nested" [nock| [0 1 2 3 4 5] |] [nock| [@ RRRRR] |] (eqNock [nock| 5 |]), Test "quote" [nock| [0 1] |] [nock| [quote [1 0]] |] (eqNock [nock| [1 0] |]), Test "apply" [nock| [0 1] |] [nock| [apply [@ S] [quote [@ R]]] |] (eqNock [nock| 1 |]), - Test "isCell atom" [nock| [0 1] |] [nock| [isCell 11] |] (eqNock [nock| false |]), - Test "isCell cell" [nock| [0 1] |] [nock| [isCell [1 0]] |] (eqNock [nock| true |]), + Test "isCell atom" [nock| [0 1] |] [nock| [isCell [@ L]] |] (eqNock [nock| false |]), + Test "isCell cell" [nock| [0 1] |] [nock| [isCell [@ S]] |] (eqNock [nock| true |]), Test "suc" [nock| [0 1] |] [nock| [suc [quote 1]] |] (eqNock [nock| 2 |]), Test "eq" [nock| [0 1] |] [nock| [= [1 0] [1 0]] |] (eqNock [nock| true |]), Test "eq" [nock| [0 1] |] [nock| [= [1 0] [0 1]] |] (eqNock [nock| false |]),