LAST-NLAST returns a cons and not an element.
BUTLAST takes an argument N but LAST does not.
LAST to take an optional argument N, saying how many cells to return. The default for N would be 1.
It is an error if N is negative or L is circular.
If N is zero, then the atom that terminates the list L is returned.
If N is greater than or equal to the number of cons cells in the list L, then the result is L.
(LAST '(A B C) 0) => () (BUTLAST '(A B C) 0) => (A B C)
(LAST '(A B C) 1) => (C) (BUTLAST '(A B C) 1) => (A B)
(LAST '(A B C) 2) => (B C) (BUTLAST '(A B C) 2) => (A)
(LAST '(A B C) 3) => (A B C) (BUTLAST '(A B C) 3) => ()
(LAST '(A B C) 4) => (A B C) (BUTLAST '(A B C) 4) => ()
(LAST '(A B C)) => (C) (BUTLAST '(A B C)) => (A B)
(LAST '(A . B) 0) => B (LAST '(A . B) 1) => (A . B) (LAST '(A . B) 2) => (A . B)
BUTLAST and LAST would select complementary parts of a list in general. That is (EQUAL L (APPEND (BUTLAST L N) (LAST L N))) would be T for N >= 0 and L being a proper list.
This would make it more obvious why LAST should return a list and not an element. ie, it would return the "last N elements" where N=1 by default.
(DEFUN LAST (LIST &OPTIONAL (N 1)) (CHECK-TYPE N (INTEGER 0)) (DO ((L LIST (CDR L)) (R LIST) (I 0 (+ I 1))) ((ATOM L) R) (IF (>= I N) (POP R))))
Some implementations might want to provide compiler optimizations for the N=1 case.
NLEFT) in Symbolics Common Lisp and Interlisp.CL community might want to adopt it, too. Pitman thinks it's a nice idea.
Masinter opposes this extension as gratuitous.
Moon and Daniels think this is very low priority but have expressed a lack of major objection to this proposal.