eval env (VarExpr n) = do
    mEntry <- return $ findEntry env n
    case mEntry of
        (Just (SymBinding expr)) -> eval env expr
        (Just (SymFunc func)) -> return $ FuncCtx (Defined (funcArgCount func) func) []
        Nothing -> do
            case M.lookup n builtins of
                Just b -> return $ FuncCtx b []
                Nothing -> throwError $ SymbolNotFound (n)

-- ^ A conditional expression
eval env (VarExpr n) = do
    mEntry <- return $ findEntry env n
    case mEntry of
        (Just (SymBinding expr)) -> eval env expr
        (Just (SymFunc func)) -> return $ FuncCtx (Defined (funcArgCount func) func) []
        Nothing -> do
            case M.lookup n builtins of
                Just b -> return $ FuncCtx b []
                Nothing -> throwError $ SymbolNotFound (n)

-- ^ A conditional expression
eval env (VarExpr n) = do
    mEntry <- return $ findEntry env n
    case mEntry of
        (Just (SymBinding expr)) -> eval env expr
        (Just (SymFunc func)) -> return $ FuncCtx (Defined (funcArgCount func) func) []
        Nothing -> do
            case M.lookup n builtins of
                Just b -> return $ FuncCtx b []
                Nothing -> throwError $ SymbolNotFound (n)

-- ^ A conditional expression