mirror of
https://github.com/kanaka/mal.git
synced 2024-11-11 00:52:44 +03:00
a9cd654347
I'm away from my main workstation for a week and unfortunately, I only copied the code but not the branch with full history so this is just the implementation. However, the history isn't all that interesting (mostly just the steps one at a time) and I wanted to get this out there.
45 lines
1.4 KiB
Groovy
45 lines
1.4 KiB
Groovy
import groovy.json.StringEscapeUtils
|
|
import types
|
|
import types.MalSymbol
|
|
import types.MalAtom
|
|
|
|
|
|
class printer {
|
|
def static _pr_list(lst, sep, Boolean print_readably) {
|
|
return lst.collect{ e -> pr_str(e, print_readably) }.join(sep)
|
|
}
|
|
|
|
def static pr_str(exp, Boolean print_readably) {
|
|
def _r = print_readably
|
|
switch (exp) {
|
|
case { types.list_Q(exp) }:
|
|
def lst = exp.collect { pr_str(it, _r) }
|
|
return "(${lst.join(" ")})"
|
|
case { types.vector_Q(exp) }:
|
|
def lst = exp.collect { pr_str(it, _r) }
|
|
return "[${lst.join(" ")}]"
|
|
case Map:
|
|
def lst = []
|
|
exp.each { k,v -> lst.add(pr_str(k,_r)); lst.add(pr_str(v,_r)) }
|
|
return "{${lst.join(" ")}}"
|
|
case String:
|
|
if (types.keyword_Q(exp)) {
|
|
return ":" + exp.drop(1)
|
|
} else if (print_readably) {
|
|
return "\"${StringEscapeUtils.escapeJava(exp)}\""
|
|
} else {
|
|
return exp
|
|
}
|
|
case null:
|
|
return 'nil'
|
|
case MalSymbol:
|
|
return exp.value
|
|
case MalAtom:
|
|
return "(atom ${exp.value})"
|
|
default:
|
|
return exp.toString()
|
|
}
|
|
}
|
|
}
|
|
|