Smarter decoding of terms

This update includes an update to `decodeResult` that makes string
decoding far less aggressive. This also replaces the `!decode` REPL
command with `!output` to allow users to switch output format on the
fly. New tests are included for verifying decoding behavior; this group
needs to be fleshed out further.
This commit is contained in:
2025-02-07 15:04:13 -06:00
parent 871245b567
commit e6e18239a7
4 changed files with 92 additions and 32 deletions

View File

@@ -160,8 +160,18 @@ toAscii tree = go tree "" True
++ go right (prefix ++ (if isLast then " " else "| ")) True
decodeResult :: T -> String
decodeResult tc
| Right num <- toNumber tc = show num
| Right str <- toString tc = "\"" ++ str ++ "\""
| Right list <- toList tc = "[" ++ intercalate ", " (map decodeResult list) ++ "]"
| otherwise = formatResult TreeCalculus tc
decodeResult Leaf = "t"
decodeResult tc =
case (toString tc, toList tc, toNumber tc) of
(Right s, _, _) | all isCommonChar s -> "\"" ++ s ++ "\""
(_, _, Right n) -> show n
(_, Right xs@(_:_), _) -> "[" ++ intercalate ", " (map decodeResult xs) ++ "]"
(_, Right [], _) -> "[]"
_ -> formatResult TreeCalculus tc
where
isCommonChar c =
let n = fromEnum c
in (n >= 32 && n <= 126)
|| n == 9
|| n == 10
|| n == 13