// LTD: Function PROVIDE not yet implemented. provide(#"ucons1"); // (c) 1990, 1991, Richard J. Fateman "(in-package mma)"; // alternative to ucons1 file // for non-Allegro CL. This is a much inferior version in // efficiency of the unique-ification, and any CL could do // better. But maybe not the same way. // Simplest way to make the substitution would be to rename this // file ucons1.lisp. define variable *uniq-table* = make(, test: \==); define variable *uniq-atom-table* = make(
, test: \=); define method uniq (x) // Return a canonical representation that is EQUAL to x, // such that (equal x y) => (eq (uniq x) (uniq y)) select (x by instance?) fixnum | symbol => x; atom => *uniq-atom-table*[x] | (*uniq-atom-table*[x] := x); cons => ucons(uniq(head(x)), // this could check in // *uniq-table* first... uniq(tail(x))); end select; end method uniq; define method ucons (x, y) // Unique cons: (eq (ucons x y) (ucons x y)) is always true. let car-table = *uniq-table*[x] | (*uniq-table*[x] := make(
, test: \==, size: 10)); // At this point, car-table is a hash-table that either has // (cons x y) in it, hashed under the key y, or we create // such an item and store it. car-table[y] | (car-table[y] := pair(x, y)); end method ucons; define method umapcar (f, x) if (empty?(x)) #f; else ucons(f(head(x)), umapcar(f, tail(x))); end if; end method umapcar; // LTD: No macros. #"ulist"; define method uappend (r, s) if (empty?(r)) s; else ucons(head(r), uappend(tail(r), s)); end if; end method uappend;