Copyright (C) 2000-2012 |
GNU Info (emacs-lisp-intro.info)Wrong Type of ArgumentUsing 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. In GNU Emacs version 21, 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. 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. In GNU Emacs version 20 and before, the echo area displays an error message that says: Wrong type argument: number-or-marker-p, hello This says, in different words, the same as the top line of the `*Backtrace*' buffer. automatically generated by info2www version 1.2.2.9 |