mirror of
https://github.com/kanaka/mal.git
synced 2024-10-27 14:52:16 +03:00
8a19f60386
- Reorder README to have implementation list after "learning tool" bullet. - This also moves tests/ and libs/ into impls. It would be preferrable to have these directories at the top level. However, this causes difficulties with the wasm implementations which need pre-open directories and have trouble with paths starting with "../../". So in lieu of that, symlink those directories to the top-level. - Move the run_argv_test.sh script into the tests directory for general hygiene.
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()
|
|
}
|
|
}
|
|
}
|
|
|