/* * Hash a term. */ extern hash_t hash_term(term_t t) { switch (type(t)) { case VAR: return hash_var(var(t)); case NIL: return hash_nil(); case BOOL: return hash_bool(boolean(t)); case NUM: return hash_num(num(t)); case ATOM: return hash_atom(atom(t)); case STR: return hash_string(string(t)); case FOREIGN: return hash_foreign(foreign(t)); case FUNC: return hash_func(func(t)); default: { hash_t dummy = HASH(0, 0); return dummy; } } }
HEADER_DECLARE hash_t hash_rec(Term* term, hash_t hash){ term = chase(term); switch(term->type){ case INTEGER: return hash_integer(term->data.integer, hash); case FUNCTOR: hash = hash_atom(term->data.functor.atom, hash); functor_size_t size = term->data.functor.size; if(size){ hash = hash_byte(size, hash); for(functor_size_t i = 0; i < size; i++){ hash = hash_rec(term->data.functor.args[i], hash); } } return hash; case STRING: return hash_string(&term->data.string, hash); case VAR: fatal_error("Cannot hash variable '%s'", term->data.var.name); case DICT: fatal_error("unimplemented: hash dict"); case MOVED: fatal_error("Cannot hash a moved term"); } UNREACHABLE; }