1
1
mirror of https://github.com/kanaka/mal.git synced 2024-09-20 10:07:45 +03:00
mal/groovy/printer.groovy
Joel Martin a9cd654347 Add groovy implementation.
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.
2015-05-18 19:54:18 -07:00

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