Merge pull request #383 from asarhaddon/ada2tco-do
[jackhill/mal.git] / elm / Printer.elm
index e23d0fd..2c4402a 100644 (file)
@@ -2,12 +2,18 @@ module Printer exposing (..)
 
 import Array exposing (Array)
 import Dict exposing (Dict)
-import Types exposing (Env, MalExpr(..), keywordPrefix)
+import Types exposing (Env, MalExpr(..), keywordPrefix, MalFunction(..))
 import Utils exposing (encodeString, wrap)
+import Env
 
 
-printString : Bool -> MalExpr -> String
-printString readably ast =
+printStr : Bool -> MalExpr -> String
+printStr =
+    printString Env.global
+
+
+printString : Env -> Bool -> MalExpr -> String
+printString env readably ast =
     case ast of
         MalNil ->
             "nil"
@@ -22,7 +28,7 @@ printString readably ast =
             toString int
 
         MalString str ->
-            printRawString readably str
+            printRawString env readably str
 
         MalSymbol sym ->
             sym
@@ -31,49 +37,64 @@ printString readably ast =
             kw
 
         MalList list ->
-            printList readably list
+            printList env readably list
 
         MalVector vec ->
-            printVector readably vec
+            printVector env readably vec
 
         MalMap map ->
-            printMap readably map
+            printMap env readably map
 
         MalFunction _ ->
             "#<function>"
 
         MalAtom atomId ->
-            "#<atom:" ++ (toString atomId) ++ ">"
+            let
+                value =
+                    Env.getAtom atomId env
+            in
+                "(atom " ++ (printString env True value) ++ ")"
 
         MalApply _ ->
             "#<apply>"
 
 
-printRawString : Bool -> String -> String
-printRawString readably str =
+printBound : Env -> Bool -> List ( String, MalExpr ) -> String
+printBound env readably =
+    let
+        printEntry name value =
+            name ++ "=" ++ (printString env readably value)
+    in
+        List.map (uncurry printEntry)
+            >> String.join " "
+            >> wrap "(" ")"
+
+
+printRawString : Env -> Bool -> String -> String
+printRawString env readably str =
     if readably then
         encodeString str
     else
         str
 
 
-printList : Bool -> List MalExpr -> String
-printList readably =
-    List.map (printString readably)
+printList : Env -> Bool -> List MalExpr -> String
+printList env readably =
+    List.map (printString env readably)
         >> String.join " "
         >> wrap "(" ")"
 
 
-printVector : Bool -> Array MalExpr -> String
-printVector readably =
-    Array.map (printString readably)
+printVector : Env -> Bool -> Array MalExpr -> String
+printVector env readably =
+    Array.map (printString env readably)
         >> Array.toList
         >> String.join " "
         >> wrap "[" "]"
 
 
-printMap : Bool -> Dict String MalExpr -> String
-printMap readably =
+printMap : Env -> Bool -> Dict String MalExpr -> String
+printMap env readably =
     let
         -- Strip off the keyword prefix if it is there.
         printKey k =
@@ -82,13 +103,13 @@ printMap readably =
                     if prefix == keywordPrefix then
                         rest
                     else
-                        printRawString readably k
+                        printRawString env readably k
 
                 _ ->
-                    printRawString readably k
+                    printRawString env readably k
 
         printEntry ( k, v ) =
-            (printKey k) ++ " " ++ (printString readably v)
+            (printKey k) ++ " " ++ (printString env readably v)
     in
         Dict.toList
             >> List.map printEntry
@@ -102,11 +123,13 @@ printEnv env =
         printOuterId =
             Maybe.map toString >> Maybe.withDefault "nil"
 
-        printHeader frameId { outerId, refCnt } =
+        printHeader frameId { outerId, exitId, refCnt } =
             "#"
                 ++ (toString frameId)
                 ++ " outer="
                 ++ printOuterId outerId
+                ++ " exit="
+                ++ printOuterId exitId
                 ++ " refCnt="
                 ++ (toString refCnt)
 
@@ -120,7 +143,7 @@ printEnv env =
             printFrame k v :: acc
 
         printDatum k v acc =
-            (k ++ " = " ++ (printString True v)) :: acc
+            (k ++ " = " ++ (printString env False v)) :: acc
     in
         "--- Environment ---\n"
             ++ "Current frame: #"