aboutsummaryrefslogtreecommitdiff
path: root/haskell/Printer.hs
diff options
context:
space:
mode:
authorJoel Martin <github@martintribe.org>2014-12-23 22:37:43 -0700
committerJoel Martin <github@martintribe.org>2015-01-09 16:16:52 -0600
commitfa9a9758e0d15abe670fbbfd8efa1fce013b1414 (patch)
tree7ee5dceceaa79cf0269ae74d10aa297504c69da3 /haskell/Printer.hs
parentb76aa73bc76a28d7c6bb3c5a43acc9afd9ec42c8 (diff)
downloadmal-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.hs45
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