1
1
mirror of https://github.com/kanaka/mal.git synced 2024-11-13 01:43:50 +03:00
mal/groovy/printer.groovy

45 lines
1.4 KiB
Groovy
Raw Normal View History

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()
}
}
}