mirror of
https://github.com/kanaka/mal.git
synced 2024-09-11 21:57:38 +03:00
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()
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|