Subject: Re: ANSI spec brain damaged wrt case in dispatch macro char From: Erik Naggum <erik@naggum.net> Date: 2000/12/03 Newsgroups: comp.lang.lisp Message-ID: <3184871207489902@naggum.net> * Richard Fateman <fateman@cs.berkeley.edu> | At the risk of tossing gasoline on a fire that has | almost burned out... I think using "braindamaged" about a technical decision like this is indicative of a lack of interest in solving a problem and a desire to toss gasoline on the embers to start a new fire aflaming. | I thought what a great application for read table hacking. Really? That doesn't look awfully smart to me, but OK, let's assume it's a possible application of read tables, not contrived gasoline. | Clearly I should make [ into a dispatch character, and I should use | set-dispatch-macro-character to do the processing of the next | modifier character, e.g. F or s in the examples above, and collect | the arguments. I'd think it would be a lot smarter to read the "list" in as a whole since you would have to read up to the enclosing ] in every "macro", associate functions with the characters, strings, or symbols that make up the first object, and call the function associated with the first object when you hit that final ]. | This clear win turns into a sour taste, when debugging since lisp | forbids you from separately doing | | (set-dispatch-macro-character #\[ #\s .... ) | (set-dispatch-macro-character #\[ #\S .... ) | | from the ANSI spec. | set-dispatch-macro-character causes new-function to be called | when disp-char followed by sub-char is read. If sub-char is a | lowercase letter, it is converted to its uppercase equivalent. | It is an error if sub-char is one of the ten decimal digits. This is a valid _complaint_, of course, even though the application still seems contrived to cause an unnecessary problem and conflict. A proposal that should be both backward compatible and easy to implement: The _standard_ dispatch macro characters are defined for the standard-case letters ("standard-case" being defined in a proposal yet to be published, pretend it reads "uppercase" if you really have to) and the case of the character _read_ should be adjusted according to the readtable-case of the readtable prior to dispatching. That is, it was a design flaw to introduce case knowledge in the function that sets up the dispatch tables. The problem of case gets bigger according as the character sets get bigger. Since modern languages should support Unicode natively and efficiently and this is hard to accomplish if you want to maintain a case-insensitivity throughout the entire character set and system, we need to rethink our character sensitivity needs a little bit. It is _not_ hard to implement case-insensitivity in the Lisp reader as we read character by character and already have to do a number of costly conversions, anyway. E.g., a character object could easily contain information about the case and the distance in the code space to the corresponding character of the other case. (This holds for everything but three _stupidly_ transliterated characters from Cyrillic to Latin or whatever, but people who actually _use_ those should just be shot, anyway, so I'll pull a Foderaro and say that "in practice" it is not a problem, with nigh a thought for the doofuses who wanted those wacky "characters" in the first place.) | Thus the ANSI spec insists on changing #\s into #\S. That's an amazingly inaccurate statement. | This seems totally brain-damaged to me. It requires that I dispatch | to #\S and then look again at the sub-char to see if it was #\s or | #\S, in effect dispatching AGAIN. (defun macro-case-dispatch (uppercase lowercase) (lambda (stream char infix) (let ((call (if (upper-case-p char) uppercase lowercase))) (if call (funcall call stream char arg) #+allegro (excl::dispatch-char-error stream char arg))))) Now you can do straightforward stuff like this: (set-dispatch-macro-character #\# #\Z (macro-case-dispatch #'FOOBAR #'foobar)) I don't think this seems brain-damaged at all, but it probably still seems "totally brain-damaged" to you, since you aren't going to accept any other solution than "the standard is broken because upper-case is insane", isn't that right? | I wonder if there are other places that the ANSI standard specifies | that --even though you wrote the backslashed character in lower case-- | that it will change it to upper case. Well, char-upcase is a rather obvious candidate. :) | While I suppose there is some theological argument defending this | decision, (and, by the way, Franz seems to abide by ANSI in this | instance), I think it would be nice to have a | set-dispatch-macro-character-retaining-case function, which could | trivially be used to implement the brain-damaged version by | upper-casing its 2nd argument. The reverse transformation is not | trivial. However dubious your "braindamage" label about the case problems in general, _that_ is a truly braindamaged solution to your "problem". After having watched not one, but two, astonishingly stupid ways _not_ to deal with the upper-case issue in ANSI Common Lisp, I must wonder whether the desire to be _annoyed_ by upper-case issues has caused a few old Lispers to go slightly bananas, making them miss some obvious technical solutions to their problems in preference to broken, stupid non-solutions that do nothing but show people how irrationally annoyed _they_ are with the upper-case decision. This is more than bitterness at having to deal with a standard and people who voted them down in a committee, which probably would never have happened if they had been only _somewhat_ less antagonistic to upper-case to begin with, How can you _fail_ to get the majority of a committee to agree with you that lower-case is better than upper-case, when that clearly is the simplest, best, most obvious solution? My take: Accuse your opponents of suffering braindamaged _before_ you have even presented your case, and prefer to continue to call them braindamaged while you utterly fail to present a better technical solution to _their_ concerns. _I'm_ annoyed with the proponents of a lower-case Common Lisp that had a chance to affect the standard, because if _they_ had not been so braindamaged, maybe we would've had a lower-case symbol names today. #:Erik -- "When you are having a bad day and it seems like everybody is trying to piss you off, remember that it takes 42 muscles to produce a frown, but only 4 muscles to work the trigger of a good sniper rifle." -- Unknown