From ef80d723ca3de3d893f03b53276179ce5ece173f Mon Sep 17 00:00:00 2001 From: darkf Date: Fri, 25 Oct 2013 02:20:23 -0700 Subject: [PATCH] use patterns for definitions instead of identifiers --- ast.hs | 2 +- interp.hs | 11 +++++++---- parser.hs | 6 +++--- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/ast.hs b/ast.hs index ac84aa5..0e54b47 100644 --- a/ast.hs +++ b/ast.hs @@ -15,7 +15,7 @@ data AST = Add AST AST | Block [AST] | FunDef String (Pattern, AST) | Defun String AST - | Def String AST + | Def Pattern AST | Var String | Lambda [(Pattern, AST)] | Call String AST diff --git a/interp.hs b/interp.hs index 31276c3..b8e4ebd 100644 --- a/interp.hs +++ b/interp.hs @@ -219,11 +219,14 @@ eval (Defun name fn) = do newfn = FnV cls (oldpats ++ [(pat, body)]) in put (s, bind env name newfn) >> return newfn -eval (Def name v') = do +eval (Def pat v') = do v <- eval v' - (s,env) <- get - put (s, bind env name v) - return v + (s,locals:xs) <- get + case patternBindings pat v of + Nothing -> error $ "pattern binding doesn't satisfy: " ++ show v ++ " with " ++ show pat + Just bindings -> + put (s, (M.union bindings locals):xs) >> -- update our local bindings + return v eval (Lambda pats) = get >>= \(_,env) -> diff --git a/parser.hs b/parser.hs index cc850e9..03eae14 100644 --- a/parser.hs +++ b/parser.hs @@ -158,23 +158,23 @@ ifExpr = do bool = fmap BoolConst $ (symbol "true" >> return True) <|> (symbol "false" >> return False) def = do - name <- identifier + pat <- pattern whiteSpace symbol "=" value <- exprparser - return $ Def name value + return $ Def pat value expr' = try block <|> try funDef <|> try call <|> try lambda + <|> try def <|> try (emptyTuple TupleConst) <|> try (tupleSeq exprparser TupleConst) <|> parens exprparser <|> listSeq exprparser ListConst <|> try ifExpr <|> try bool - <|> try def <|> fmap Var identifier <|> fmap StrConst stringLiteral <|> fmap IntConst integer