From fa9a9758e0d15abe670fbbfd8efa1fce013b1414 Mon Sep 17 00:00:00 2001 From: Joel Martin Date: Tue, 23 Dec 2014 22:37:43 -0700 Subject: Haskell: steps 4-6. Line editing. Simpler fn calls. --- haskell/Printer.hs | 45 +++++++++++++++++++++++++++------------------ 1 file changed, 27 insertions(+), 18 deletions(-) (limited to 'haskell/Printer.hs') 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) = "#" - -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) = "#" +_pr_str _ (MalFunc {ast=ast, env=fn_env, params=params}) = "(fn* " ++ (show params) ++ " " ++ (show ast) ++ ")" + +instance Show MalVal where show = _pr_str True -- cgit v1.2.3