void erase_term(Term* term) { pre_erase_term(term); set_null(term_value(term)); set_inputs(term, TermList()); change_function(term, NULL); term->type = NULL; remove_nested_contents(term); // for each user, clear that user's input list of this term remove_from_any_user_lists(term); clear_from_dependencies_of_users(term); if (term->owningBlock != NULL) { // remove name binding if necessary term->owningBlock->removeNameBinding(term); // index may be invalid if something bad has happened ca_assert(term->index < term->owningBlock->length()); term->owningBlock->_terms.setAt(term->index, NULL); term->owningBlock = NULL; term->index = -1; } dealloc_term(term); }
void destroy_term(struct term *term) { if(! term) return; switch(term->type) { case TYPE_VAR: break; case TYPE_LAMBDA: destroy_term(term->lambda.body); break; case TYPE_APPL: destroy_term(term->appl.fun); destroy_term(term->appl.arg); break; } dealloc_term(term); }