Previous: Type Predicates, Up: Lisp Data Types
Here we describe two functions that test for equality between any two objects. Other functions test equality between objects of specific types, e.g., strings. For these predicates, see the appropriate chapter describing the data type.
This function returns
t
if object1 and object2 are the same object,nil
otherwise. The “same object” means that a change in one will be reflected by the same change in the other.
eq
returnst
if object1 and object2 are integers with the same value. Also, since symbol names are normally unique, if the arguments are symbols with the same name, they areeq
. For other types (e.g., lists, vectors, strings), two arguments with the same contents or elements are not necessarilyeq
to each other: they areeq
only if they are the same object.(eq 'foo 'foo) => t (eq 456 456) => t (eq "asdf" "asdf") => nil (eq '(1 (2 (3))) '(1 (2 (3)))) => nil (setq foo '(1 (2 (3)))) => (1 (2 (3))) (eq foo foo) => t (eq foo '(1 (2 (3)))) => nil (eq [(1 2) 3] [(1 2) 3]) => nil (eq (point-marker) (point-marker)) => nilThe
make-symbol
function returns an uninterned symbol, distinct from the symbol that is used if you write the name in a Lisp expression. Distinct symbols with the same name are noteq
. See Creating Symbols.(eq (make-symbol "foo") 'foo) => nil
This function returns
t
if object1 and object2 have equal components,nil
otherwise. Whereaseq
tests if its arguments are the same object,equal
looks inside nonidentical arguments to see if their elements or contents are the same. So, if two objects areeq
, they areequal
, but the converse is not always true.(equal 'foo 'foo) => t (equal 456 456) => t (equal "asdf" "asdf") => t (eq "asdf" "asdf") => nil (equal '(1 (2 (3))) '(1 (2 (3)))) => t (eq '(1 (2 (3))) '(1 (2 (3)))) => nil (equal [(1 2) 3] [(1 2) 3]) => t (eq [(1 2) 3] [(1 2) 3]) => nil (equal (point-marker) (point-marker)) => t (eq (point-marker) (point-marker)) => nilComparison of strings is case-sensitive, but does not take account of text properties—it compares only the characters in the strings. A unibyte string never equals a multibyte string unless the contents are entirely ascii (see Text Representations).
(equal "asdf" "ASDF") => nilHowever, two distinct buffers are never considered
equal
, even if their textual contents are the same.
The test for equality is implemented recursively; for example, given
two cons cells x and y, (equal
x y)
returns t
if and only if both the expressions below return
t
:
(equal (car x) (car y)) (equal (cdr x) (cdr y))
Because of this recursive method, circular lists may therefore cause infinite recursion (leading to an error).