Exemplo n.º 1
0
API void _dump(value_t val) {
  switch (val.type) {
    case AtomType:
      switch (val.data) {
        case -4: print(CERROR"type-error"); return;
        case -1: print(CNIL"nil"); return;
        case 1: print(CBOOL"true"); return;
        case 0: print(CBOOL"false"); return;

        default: print(CUNDEF"undefined"); return;
      }
    case IntegerType:
      print(CINT);
      print_int(val.data);
      return;
    case SymbolType:
      if (val.data < 0) print(CSYM);
      else print(CBUILTIN);
      print(symbols_get_name(val.data));
      return;
    case PairType: {
      value_t node = seen;
      while (node.type == PairType) {
        pair_t pair = get_pair(node);
        if (eq(pair.left, val)) {
          print(CPAREN"("CSEP"..."CPAREN")");
          return;
        }
        node = pair.right;
      }
      seen = cons(val, seen);
      pair_t pair = get_pair(val);
      const char *opener, *closer;
      if (eq(pair.left, quoteSym)) {
        if (pair.right.type != PairType) {
          if (pair.right.type == SymbolType && pair.right.data < 0) {
            const char* data = symbols_get_name(pair.right.data);
            const char* p = data;
            bool whole = true;
            while (whole && *p) whole = *p++ != ' ';
            if (!whole) {
              print(CSTRING"\"");
              print(data);
              print("\"");
              return;
            }
          }
          print(CPAREN"'");
          _dump(pair.right);
          return;
        }
        opener = "'(";
        closer = ")";
        val = pair.right;
        pair = get_pair(val);
      }
      else if (eq(pair.left, listSym) && pair.right.type == PairType) {
        opener = "[";
        closer = "]";
        val = pair.right;
        pair = get_pair(val);
      }
      else {
        opener = "(";
        closer = ")";
      }
      print(CPAREN);
      print(opener);
      if (isNil(pair.right)) {
        _dump(pair.left);
      }
      else if (pair.right.type == PairType) {
        _dump(pair.left);
        while (pair.right.type == PairType) {
          print_char(' ');
          pair = get_pair(pair.right);
          _dump(pair.left);
        }
        if (!isNil(pair.right)) {
          print(CSEP" . ");
          _dump(pair.right);
        }
      } else {
        _dump(pair.left);
        print(CSEP" . ");
        _dump(pair.right);
      }
      print(CPAREN);
      print(closer);
      return;
    }
  }
}
Exemplo n.º 2
0
void visitFieldName(Ident i)
{
  if(symbols_is_FieldName(i)) fprintf(stderr, "Error: %s nie jest nazwą pola\n", symbols_get_name(i));
}