add cons expression
This commit is contained in:
parent
e60deb4ca2
commit
0770474931
1
ast.hs
1
ast.hs
|
@ -16,6 +16,7 @@ data AST = Add AST AST
|
||||||
| Lambda [(Pattern, [AST])]
|
| Lambda [(Pattern, [AST])]
|
||||||
| Call String [AST]
|
| Call String [AST]
|
||||||
| UnitConst
|
| UnitConst
|
||||||
|
| Cons AST AST
|
||||||
| ListConst [AST]
|
| ListConst [AST]
|
||||||
| StrConst String
|
| StrConst String
|
||||||
| IntConst Integer
|
| IntConst Integer
|
||||||
|
|
|
@ -90,6 +90,13 @@ eval UnitConst = return UnitV
|
||||||
|
|
||||||
eval (Block body) = foldr1 (>>) $ map eval body
|
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) =
|
eval (ListConst v) =
|
||||||
mapM eval v >>= \xs ->
|
mapM eval v >>= \xs ->
|
||||||
return $ ListV xs
|
return $ ListV xs
|
||||||
|
|
11
parser.hs
11
parser.hs
|
@ -110,7 +110,13 @@ call = do
|
||||||
symbol ")"
|
symbol ")"
|
||||||
return $ Call name args'
|
return $ Call name args'
|
||||||
|
|
||||||
term = try block
|
consExpr = do
|
||||||
|
x <- expr'
|
||||||
|
symbol "::"
|
||||||
|
y <- exprparser
|
||||||
|
return $ Cons x y
|
||||||
|
|
||||||
|
expr' = try block
|
||||||
<|> try funDef
|
<|> try funDef
|
||||||
<|> try call
|
<|> try call
|
||||||
<|> parens exprparser
|
<|> parens exprparser
|
||||||
|
@ -119,6 +125,9 @@ term = try block
|
||||||
<|> fmap StrConst stringLiteral
|
<|> fmap StrConst stringLiteral
|
||||||
<|> fmap IntConst integer
|
<|> fmap IntConst integer
|
||||||
|
|
||||||
|
term = try consExpr
|
||||||
|
<|> expr'
|
||||||
|
|
||||||
seqStmt = sepBy1 statement semi
|
seqStmt = sepBy1 statement semi
|
||||||
|
|
||||||
program =
|
program =
|
||||||
|
|
Loading…
Reference in New Issue