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; } } }
void visitFieldName(Ident i) { if(symbols_is_FieldName(i)) fprintf(stderr, "Error: %s nie jest nazwą pola\n", symbols_get_name(i)); }