1
1
mirror of https://github.com/kanaka/mal.git synced 2024-08-18 02:00:40 +03:00
mal/impls/groovy/printer.groovy
Joel Martin 8a19f60386 Move implementations into impls/ dir
- 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.
2020-02-10 23:50:16 -06: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()
}
}
}