[armedbear-devel] [j-devel] slime swank-abcl.lisp

Mark Evenson evenson at panix.com
Wed Sep 16 09:22:35 UTC 2009

On 9/16/09 12:23 AM, Tobias C. Rittweiler wrote:
> I think there's an off-by-one in SOURCE-LOCATION. In Emacs, a buffer
> starts at 1, but in Common Lisp a file-position starts at 0.
> (Caveat: `(goto-char 0)' in DWIM fashion will also bring you to the
> beginning of a buffer.)
> I think that's the reason why you put the (PLUSP POS) there to guard
> against this issue, but merely passing (IF POS (1+ POS) 1) should also
> suffice. Perhaps you want to put this into an extra function so the
> casual hacker will be aware of it more easily.

There certainly is an "off-by-one" here if Emacs buffers start at 1 
(this surprised me!), but I don't quite understand what Tobias is 
proposing here.

The intention of the first operand in the (AND POS (PLUSP POS) was to 
guard against getting a nil from EXT:SOURCE-FILE-POSITION, right?  So 
don't we want this implementation:

(defun source-location (symbol)
   (when (pathnamep (ext:source-pathname symbol))
     (let ((pos (ext:source-file-position symbol)))
            (:file ,(namestring (ext:source-pathname symbol)))
            ,(if pos
                 (list :position (1+ pos))
                 (list :function-name (string symbol)))
            (:align t)))))))

"A screaming comes across the sky.  It has happened before, but there
is nothing to compare to it now."

More information about the armedbear-devel mailing list