smalltalk-tng
diff experiments/haskell/matcher.hs @ 323:454c18798969
merger
| author | Tony Garnock-Jones <tonygarnockjones@gmail.com> |
|---|---|
| date | Tue Feb 07 11:34:20 2012 -0500 (3 months ago) |
| parents | 901d1b57b630 |
| children |
line diff
1.1 --- a/experiments/haskell/matcher.hs Sat May 13 00:20:51 2006 +1200 1.2 +++ b/experiments/haskell/matcher.hs Tue Feb 07 11:34:20 2012 -0500 1.3 @@ -54,13 +54,16 @@ 1.4 ident = P.identifier tngTokenizer 1.5 integer = P.integer tngTokenizer 1.6 punct s = do string s; whiteSpace; return () 1.7 +operator = P.operator tngTokenizer 1.8 +comma = P.comma tngTokenizer 1.9 1.10 readAST = readApp 1.11 readApp = do (part : parts) <- sepBy1 readSimple whiteSpace; return $ foldl AstApp part parts 1.12 -readMap = try (do entries <- sepBy readMapEntry whiteSpace; return $ AstObject entries) 1.13 +readSquare = try (do entries <- sepBy readMapEntry whiteSpace; return $ AstObject entries) 1.14 + <|> try (do entries <- sepBy readApp comma; return $ buildList entries) 1.15 readMapEntry = do l <- readSimple; punct ":"; r <- readSimple; return (l, r) 1.16 readSimple = do punct "("; v <- readAST; punct ")"; return v 1.17 - <|> do punct "["; m <- readMap; punct "]"; return m 1.18 + <|> do punct "["; m <- readSquare; punct "]"; return m 1.19 <|> do string "+"; i <- ident; readBinding i 1.20 <|> do punct "_"; return AstDiscard 1.21 <|> do i <- integer; return $ AstLiteral $ LitInt i 1.22 @@ -70,6 +73,9 @@ 1.23 readBinding i = do punct "@"; v <- readSimple; return $ AstBinding i v 1.24 <|> (return $ AstBinding i AstDiscard) 1.25 1.26 +buildList [] = AstObject [] 1.27 +buildList (x:xs) = (AstAtom "cons" `AstApp` x) `AstApp` buildList xs 1.28 + 1.29 sepList s [] = "" 1.30 sepList s [x] = x 1.31 sepList s (x:xs) = x ++ s ++ sepList s xs 1.32 @@ -288,7 +294,7 @@ 1.33 eval' exp = eval [] (readTng exp) 1.34 1.35 baseEnv = [ def "cons" "[+car: [+cdr: [First: car Rest: cdr]]]" 1.36 - , def "map" "[+f: loop=[(cons +a +d): (cons (f a) (loop d)) Nil:Nil]]" 1.37 + , def "map" "[+f: loop=[(cons +a +d): (cons (f a) (loop d)) +x: x]]" 1.38 , defPrim "add" $ \(VLiteral (LitInt i)) -> p $ \(VLiteral (LitInt j)) -> VLiteral (LitInt (i + j)) 1.39 ] 1.40 where def nm exp = def' nm $ eval' exp
