[Ecls-list] Broken dispatching macro characters

Adam Warner lists at consulting.net.nz
Sat Apr 16 23:50:30 UTC 2005


Hi all,

I believe this code should compile:

(eval-when (:compile-toplevel :load-toplevel :execute)
  (defconstant |FALSE| '|FALSE|)
  (set-dispatch-macro-character
   #\# #\f
   (lambda (stream sub-char n)
     (declare (ignore stream sub-char n))
     '|FALSE|)))

(eval-when (:compile-toplevel :load-toplevel :execute)
  (export '|false|)
  (declaim (inline |false|))
  (defun |false| (arg)
    (eq arg #f)))

In ECL this occurs:

No dispatch function defined for character #\f.
Broken at LOAD.

It turns out that only #F is defined, not #f.

SET-DISPATCH-MACRO-CHARACTER specifies that "If sub-char is a lowercase
letter, it is converted to its uppercase equivalent." So you're right in
defining #F.

2.4.8 Sharpsign states: "The standard syntax includes constructs
introduced by the # character. The syntax of these constructs is as
follows: a character that identifies the type of construct is followed by
arguments in some form. If the character is a letter, its case is not
important; #O and #o are considered to be equivalent, for example."

Because the specification provides no way to dispatch on a lowercase
sub-char distinct from an uppercase sub-char it seems reasonable that
lowercase sub-chars are converted to their uppercase equivalent. Other
implementations do this.

Note that non-dispatching macro characters are distinguished by case.

A better specification would leave the case of sub-char alone in
SET-DISPATCH-MACRO-CHARACTER and define duplicate definitions for
standard sharpsign syntax, i.e. #O and #o would be equivalent because
distinct sub-chars O and o would invoke the same reader function.

Regards,
Adam





More information about the ecl-devel mailing list