diff options
| author | Joel Martin <github@martintribe.org> | 2014-12-23 22:37:43 -0700 |
|---|---|---|
| committer | Joel Martin <github@martintribe.org> | 2015-01-09 16:16:52 -0600 |
| commit | fa9a9758e0d15abe670fbbfd8efa1fce013b1414 (patch) | |
| tree | 7ee5dceceaa79cf0269ae74d10aa297504c69da3 /haskell/Printer.hs | |
| parent | b76aa73bc76a28d7c6bb3c5a43acc9afd9ec42c8 (diff) | |
| download | mal-fa9a9758e0d15abe670fbbfd8efa1fce013b1414.tar.gz mal-fa9a9758e0d15abe670fbbfd8efa1fce013b1414.zip | |
Haskell: steps 4-6. Line editing. Simpler fn calls.
Diffstat (limited to 'haskell/Printer.hs')
| -rw-r--r-- | haskell/Printer.hs | 45 |
1 files changed, 27 insertions, 18 deletions
diff --git a/haskell/Printer.hs b/haskell/Printer.hs index 94bc5ed..1cc2a97 100644 --- a/haskell/Printer.hs +++ b/haskell/Printer.hs @@ -1,13 +1,20 @@ module Printer -( _pr_str ) +( _pr_str, _pr_list ) where import qualified Data.Map as Map import Types -_pr_list :: [MalVal] -> String -_pr_list = unwords . map _pr_str +--concat (map (++ delim) list) +--join [] delim = [] +--join (x:xs) delim = x ++ delim ++ join xs delim + + +_pr_list :: Bool -> String -> [MalVal] -> String +_pr_list pr sep [] = [] +_pr_list pr sep (x:[]) = (_pr_str pr x) +_pr_list pr sep (x:xs) = (_pr_str pr x) ++ sep ++ (_pr_list pr sep xs) _flatTuples ((a,b):xs) = MalString a : b : _flatTuples xs _flatTuples _ = [] @@ -18,19 +25,21 @@ unescape chr = case chr of '"' -> "\\\"" c -> [c] -_pr_str :: MalVal -> String -_pr_str (MalString ('\x029e':str)) = ":" ++ str -_pr_str (MalString str) = "\"" ++ concatMap unescape str ++ "\"" -_pr_str (MalSymbol name) = name -_pr_str (MalKeyword name) = ":" ++ name -_pr_str (MalNumber num) = show num -_pr_str (MalTrue) = "true" -_pr_str (MalFalse) = "false" -_pr_str (Nil) = "nil" -_pr_str (MalList items) = "(" ++ _pr_list items ++ ")" -_pr_str (MalVector items) = "[" ++ _pr_list items ++ "]" -_pr_str (MalHashMap m) = "{" ++ _pr_list (_flatTuples $ Map.assocs m) ++ "}" -_pr_str (MalFunc f) = "#<function>" - -instance Show MalVal where show = _pr_str +_pr_str :: Bool -> MalVal -> String +_pr_str _ (MalString ('\x029e':str)) = ":" ++ str +_pr_str True (MalString str) = "\"" ++ concatMap unescape str ++ "\"" +_pr_str False (MalString str) = str +_pr_str _ (MalSymbol name) = name +_pr_str _ (MalKeyword name) = ":" ++ name +_pr_str _ (MalNumber num) = show num +_pr_str _ (MalTrue) = "true" +_pr_str _ (MalFalse) = "false" +_pr_str _ (Nil) = "nil" +_pr_str pr (MalList items) = "(" ++ (_pr_list pr " " items) ++ ")" +_pr_str pr (MalVector items) = "[" ++ (_pr_list pr " " items) ++ "]" +_pr_str pr (MalHashMap m) = "{" ++ (_pr_list pr " " (_flatTuples $ Map.assocs m)) ++ "}" +_pr_str _ (Func f) = "#<function>" +_pr_str _ (MalFunc {ast=ast, env=fn_env, params=params}) = "(fn* " ++ (show params) ++ " " ++ (show ast) ++ ")" + +instance Show MalVal where show = _pr_str True |
