apply env c@(FuncCtx de@(Defined params f)  args) arg
    | (length args) + 1 == params = do
        --arg' <- (eval env arg)
        matchAndEvalPatternExpr (funcName f) env (args ++ [arg]) (funcPatterns f)
    | otherwise = do
        -- arg' <- (eval env arg)
        return $ FuncCtx de (args ++ [arg])
-- ^At the bottom of a recursion an AppExpr might contain a Builtin or call any other
-- function that is defined within the environment.
apply env c@(FuncCtx de@(Defined params f)  args) arg
    | (length args) + 1 == params = do
        --arg' <- (eval env arg)
        matchAndEvalPatternExpr (funcName f) env (args ++ [arg]) (funcPatterns f)
    | otherwise = do
        -- arg' <- (eval env arg)
        return $ FuncCtx de (args ++ [arg])
-- ^At the bottom of a recursion an AppExpr might contain a Builtin or call any other
-- function that is defined within the environment.
apply env c@(FuncCtx de@(Defined params f)  args) arg
    | (length args) + 1 == params = do
        --arg' <- (eval env arg)
        matchAndEvalPatternExpr (funcName f) env (args ++ [arg]) (funcPatterns f)
    | otherwise = do
        -- arg' <- (eval env arg)
        return $ FuncCtx de (args ++ [arg])
-- ^At the bottom of a recursion an AppExpr might contain a Builtin or call any other
-- function that is defined within the environment.