From c0021937c5770314224a873ed5c0aacf96ccd159 Mon Sep 17 00:00:00 2001 From: crumbtoo Date: Mon, 13 Nov 2023 21:16:46 -0700 Subject: [PATCH] dyadic arith primitives! (only works on NF args) --- src/TI.hs | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/TI.hs b/src/TI.hs index 5998f38..4e2eb1d 100644 --- a/src/TI.hs +++ b/src/TI.hs @@ -209,7 +209,7 @@ step st = TiState (a:s) d h g sts primStep :: Name -> Prim -> TiState -> TiState - primStep n IntNegP (TiState s d h g sts) = + primStep _ IntNegP (TiState s d h g sts) = case isDataNode arg of True -> TiState s'' d h' g sts where @@ -229,6 +229,27 @@ step st = [argAddr] = getArgs h s arg = hLookupUnsafe argAddr h + primStep _ IntAddP st = primBinOp (+) st + +primBinOp :: (Int -> Int -> Int) -> TiState -> TiState +primBinOp f (TiState s d h g sts) = + case isDataNode xarg of + True -> case isDataNode yarg of + True -> TiState s' d h' g sts + where + h' = update h rootAddr (NNum $ x+y) + rootAddr = head s' + + -- number of arguments + s' = drop 2 s + + NNum x = xarg + NNum y = xarg + where + [xAddr,yAddr] = getArgs h s + xarg = hLookupUnsafe xAddr h + yarg = hLookupUnsafe yAddr h + getArgs :: TiHeap -> [Addr] -> [Addr] getArgs h (_:s) = fmap f s where