Quick bug fix to ALPHALESSP and ALPHAEQUAL... The comparisons such as (IF (NUMBERP X) (SETQ X (INT-CHAR X))) cause a "wrong type" error. The intended test as obviously (IF (INTEGERP X) ...): (DEFUN ALPHALESSP (X Y) "T if printed representation of X is less than that of Y. Characters and numbers come before symbols//strings, before random objects, before lists. Characters and numbers are compared using CHAR<; symbols//strings with STRING-LESSP; random objecs by printing them(!); lists are compared recursively." (IF (INTEGERP X) (SETQ X (INT-CHAR X))) ;correction (IF (INTEGERP Y) (SETQ Y (INT-CHAR Y))) ;correction (COND ((CHARACTERP X) (OR (NOT (CHARACTERP Y)) (CHAR< X Y))) ((CHARACTERP Y) NIL) ((OR (SYMBOLP X) (STRINGP X)) (OR (NOT (OR (SYMBOLP Y) (STRINGP Y))) (STRING-LESSP X Y))) ((OR (SYMBOLP Y) (STRINGP Y)) NIL) ((ATOM X) (OR (CONSP Y) (STRING-LESSP (FORMAT NIL "~S" X) (FORMAT NIL "~S" Y)))) ((ATOM Y) NIL) (T (DO ((X1 X (CDR X1)) (Y1 Y (CDR Y1))) ((NULL Y1)) (OR X1 (RETURN T)) (AND (ALPHALESSP (CAR X1) (CAR Y1)) (RETURN T)) (AND (ALPHALESSP (CAR Y1) (CAR X1)) (RETURN NIL)))))) (DEFUN ALPHAEQUAL (X Y) "T if X and Y print the same, or nearly so. Exceptions: numbers and characters are compared using = and a symbol and its pname compare as equal." (IF (INTEGERP X) (SETQ X (INT-CHAR X))) (IF (INTEGERP Y) (SETQ Y (INT-CHAR Y))) (TYPECASE X (CHARACTER (AND (CHARACTERP Y) (= X Y))) ((OR SYMBOL STRING) (AND (OR (SYMBOLP Y) (STRINGP Y)) (STRING-EQUAL X Y))) (ATOM (AND (ATOM Y) (STRING-EQUAL (FORMAT NIL "~S" X) (FORMAT NIL "~S" Y)))) (T (DO ((X1 X (CDR X1)) (Y1 Y (CDR Y1))) ((NULL X1) (NULL Y1)) (OR Y1 (RETURN NIL)) (OR (ALPHAEQUAL (CAR X1) (CAR Y1)) (RETURN NIL)))))) ...Also: how come ALPHALESSP is available globally, but ALPHAEQUAL is in package SI: ???