boolean bootstrapParser(String moduleName) {
   if (moduleTags != null) {
     IMap tags = (IMap) moduleTags.get(vf.string(moduleName));
     if (tags != null) return tags.get(vf.string("bootstrapParser")) != null;
   }
   return false;
 }
    public IValue visitMap(IMap o) throws IOException {
      append('(');
      tab();
      boolean indent = checkIndent(o);
      indent(indent);
      Iterator<IValue> mapIterator = o.iterator();
      if (mapIterator.hasNext()) {
        IValue key = mapIterator.next();
        key.accept(this);
        append(':');
        o.get(key).accept(this);

        while (mapIterator.hasNext()) {
          append(',');
          indent(indent);
          key = mapIterator.next();
          key.accept(this);
          append(':');
          o.get(key).accept(this);
        }
      }
      untab();
      indent(indent);
      append(')');

      return o;
    }
 private boolean checkIndent(IMap o) {
   if (indent && o.size() > 1) {
     for (IValue x : o) {
       Type type = x.getType();
       Type vType = o.get(x).getType();
       if (indented(type)) {
         return true;
       }
       if (indented(vType)) {
         return true;
       }
     }
   }
   return false;
 }