aboutsummaryrefslogtreecommitdiff
path: root/haskell/Printer.hs
diff options
context:
space:
mode:
authorJoel Martin <github@martintribe.org>2014-12-24 21:51:23 -0700
committerJoel Martin <github@martintribe.org>2015-01-09 16:16:53 -0600
commitc150ec41f4f0b8f384f4b1b493a5ca61db42573c (patch)
tree8cac11285240725efa7e093a54ef9573dcb2aa44 /haskell/Printer.hs
parent2988d38e84bce8531c0f21fafecb7483593cda73 (diff)
downloadmal-c150ec41f4f0b8f384f4b1b493a5ca61db42573c.tar.gz
mal-c150ec41f4f0b8f384f4b1b493a5ca61db42573c.zip
Haskell: Add steps9-A, metadata, and atoms.
Some refactoring of Core.hs to make better use of pattern matching. Only remaining thing is exception handling (generic try/throw).
Diffstat (limited to 'haskell/Printer.hs')
-rw-r--r--haskell/Printer.hs12
1 files changed, 7 insertions, 5 deletions
diff --git a/haskell/Printer.hs b/haskell/Printer.hs
index 1cc2a97..e24695f 100644
--- a/haskell/Printer.hs
+++ b/haskell/Printer.hs
@@ -3,6 +3,8 @@ module Printer
where
import qualified Data.Map as Map
+import Data.IORef (readIORef)
+import System.IO.Unsafe (unsafePerformIO)
import Types
@@ -30,15 +32,15 @@ _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 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 pr (MalAtom r _) = "(atom " ++ (_pr_str pr (unsafePerformIO (readIORef r))) ++ ")"
+_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