add cons expression

This commit is contained in:
darkf 2013-10-20 22:27:27 -07:00
parent e60deb4ca2
commit 0770474931
3 changed files with 18 additions and 1 deletions

1
ast.hs
View File

@ -16,6 +16,7 @@ data AST = Add AST AST
| Lambda [(Pattern, [AST])]
| Call String [AST]
| UnitConst
| Cons AST AST
| ListConst [AST]
| StrConst String
| IntConst Integer

View File

@ -90,6 +90,13 @@ eval UnitConst = return UnitV
eval (Block body) = foldr1 (>>) $ map eval body
eval (Cons a b) = do
a' <- eval a
b' <- eval b
case b' of
ListV v' -> return $ ListV $ a':v'
_ -> error "cons: RHS must be a list"
eval (ListConst v) =
mapM eval v >>= \xs ->
return $ ListV xs

View File

@ -110,7 +110,13 @@ call = do
symbol ")"
return $ Call name args'
term = try block
consExpr = do
x <- expr'
symbol "::"
y <- exprparser
return $ Cons x y
expr' = try block
<|> try funDef
<|> try call
<|> parens exprparser
@ -119,6 +125,9 @@ term = try block
<|> fmap StrConst stringLiteral
<|> fmap IntConst integer
term = try consExpr
<|> expr'
seqStmt = sepBy1 statement semi
program =