From: Daniel B. <da...@te...> - 2003-12-12 02:09:28
|
CLHS says "get-macro-character returns as its primary value, function, the reader macro function associated with char in readtable (if any), or else nil if char is not a macro character in readtable." Yet SBCL says, using standard syntax * (get-macro-character #\Space *readtable*) #<FUNCTION "top level local call SB!IMPL::UNDEFINED-MACRO-CHAR" {10665CD}> T 2.1.4 says #\Space was the "whitespace" syntax type, not a macro character - terminating or otherwise. I don't know if there's some interpretation of the standard that makes this behaviour allowable, but I do know it's somewhat surprising, because set-macro-character (correctly) changes the syntax type. The appended code is ugly, I concede, but I found it in the wild (in SLIME, in fact) and I don't see any other way to do it. Ideas? (defun make-source-recording-readtable (readtable source-map) "Return a source position recording copy of READTABLE. The source locations are stored in SOURCE-MAP." (let* ((tab (copy-readtable readtable)) (*readtable* tab) (undefined-macro (get-macro-character #\Space tab))) ;; not sure why this should be the case, but SBCL returns ;; #<FUNCTION "top level local call SB!IMPL::UNDEFINED-MACRO-CHAR"> ;; for (get-macro-character) on characters that aren't macros. (dotimes (code char-code-limit) (let ((char (code-char code))) (multiple-value-bind (fn term) (get-macro-character char tab) (when (and fn (not (eq fn undefined-macro))) (set-macro-character char (make-source-recorder fn source-map) term tab))))) tab)) -dan -- http://web.metacircles.com/ - Open Source software development and support |