eintr: Wrong Type of Argument
1.8.4 Using the Wrong Type Object as an Argument
------------------------------------------------
When a function is passed an argument of the wrong type, the Lisp
interpreter produces an error message. For example, the ‘+’ function
expects the values of its arguments to be numbers. As an experiment we
can pass it the quoted symbol ‘hello’ instead of a number. Position the
cursor after the following expression and type ‘C-x C-e’:
(+ 2 'hello)
When you do this you will generate an error message. What has happened
is that ‘+’ has tried to add the 2 to the value returned by ‘'hello’,
but the value returned by ‘'hello’ is the symbol ‘hello’, not a number.
Only numbers can be added. So ‘+’ could not carry out its addition.
You will create and enter a ‘*Backtrace*’ buffer that says:
---------- Buffer: *Backtrace* ----------
Debugger entered--Lisp error:
(wrong-type-argument number-or-marker-p hello)
+(2 hello)
eval((+ 2 (quote hello)))
eval-last-sexp-1(nil)
eval-last-sexp(nil)
call-interactively(eval-last-sexp)
---------- Buffer: *Backtrace* ----------
As usual, the error message tries to be helpful and makes sense after
you learn how to read it.(1)
The first part of the error message is straightforward; it says
‘wrong type argument’. Next comes the mysterious jargon word
‘number-or-marker-p’. This word is trying to tell you what kind of
argument the ‘+’ expected.
The symbol ‘number-or-marker-p’ says that the Lisp interpreter is
trying to determine whether the information presented it (the value of
the argument) is a number or a marker (a special object representing a
buffer position). What it does is test to see whether the ‘+’ is being
given numbers to add. It also tests to see whether the argument is
something called a marker, which is a specific feature of Emacs Lisp.
(In Emacs, locations in a buffer are recorded as markers. When the mark
is set with the ‘C-@’ or ‘C-<SPC>’ command, its position is kept as a
marker. The mark can be considered a number—the number of characters
the location is from the beginning of the buffer.) In Emacs Lisp, ‘+’
can be used to add the numeric value of marker positions as numbers.
The ‘p’ of ‘number-or-marker-p’ is the embodiment of a practice
started in the early days of Lisp programming. The ‘p’ stands for
“predicate”. In the jargon used by the early Lisp researchers, a
predicate refers to a function to determine whether some property is
true or false. So the ‘p’ tells us that ‘number-or-marker-p’ is the
name of a function that determines whether it is true or false that the
argument supplied is a number or a marker. Other Lisp symbols that end
in ‘p’ include ‘zerop’, a function that tests whether its argument has
the value of zero, and ‘listp’, a function that tests whether its
argument is a list.
Finally, the last part of the error message is the symbol ‘hello’.
This is the value of the argument that was passed to ‘+’. If the
addition had been passed the correct type of object, the value passed
would have been a number, such as 37, rather than a symbol like ‘hello’.
But then you would not have got the error message.
---------- Footnotes ----------
(1) ‘(quote hello)’ is an expansion of the abbreviation ‘'hello’.