Subject: Re: name-to-symbol From: Erik Naggum <erik@naggum.no> Date: 1999/05/27 Newsgroups: comp.lang.lisp Message-ID: <3136756949506727@naggum.no> * Kent M Pitman | By the way, the symbol-name of the test symbol you have assigned above is | not "test" but "TEST". * duff@iet.com (David A. Duff) | this is only true if we assume name-to-symbol calls #'read or some | variant (i.e., something which processes tokens according to the value of | *read-case*). it is quite plausible to imagine a version of | name-to-symbol that would not do that. if you are talking about Common Lisp, I know Kent was, there is no such thing as a *READ-CASE* variable that controls the case. there is a READTABLE-CASE accessor that takes a readtable, the current of which is the value of *READTABLE*. | what you say of course is true, but here you are talking about the lisp | reader, whereas above, some arbitrary function that processes strings was | being described and there's no reason whatsoever to think that such a | function would or should follow the conventions of the reader. there is no reason whatsoever that such a function should _not_ follow the conventions of reader. there is an ample supply of reasons that it should, such as the principle of least surprise, or the stronger version of same: a prohibition against forcing the willfully confusing on users. unless people use a Lisp that is not a Common Lisp, the case of the name of symbols that read and print without special syntax is upper-case. programmers should be aware of this, should be able to expect this, and should not do anything special to cater to different conventions unless they want to be portable to a Lisp that is not a Common Lisp. however, it should come as no surprise that I prefer to read lowercase instead of uppercase in code. (in prose, I prefer to let symbols stand out, and uppercase is very convenient for this purpose.) this is where the variable *PRINT-CASE* comes in. the only problem is that one needs to type in uppercase when dealing with names of symbols. since that is a context worth noting in its own right, I use a special read macro to help me, and Allegro CL has a convenient internal function that returns the casified string. I have bound it to #", so a symbol name reads #"foo", and the reader returns what the symbol-name of the symbol whose string representation were "foo" would have been, without interning the symbol -- or, in simpler terms, it returns the string that would be given to INTERN to return the symbol. I want it to be pervasive, so I have the following code in the customization files when building new images: #+franz-inc excl: (loop with readtables = (get-objects 11) for i from 1 to (aref readtables 0) for *readtable* = (aref readtables i) when (readtable-dispatch-tables *readtable*) do ;; reader for symbol names that does case conversion according to the ;; rest of the symbol reader. thanks to Sean Foderaro for the pointer. (set-dispatch-macro-character #\# #\" (named-function symbol-namestring-reader (lambda (stream character prefix) (declare (ignore prefix)) (prog1 (read-extended-token stream) (unless (char= character (read-char stream)) (internal-reader-error stream "invalid symbol-namestring syntax"))))))) note that it also works with escaped characters: #"|foo|" => "foo" regardless of case conversion, so there is no limitation to its use, other than what makes sense stylistically. (I demand no more than to be credited if you use it and that you identify any changes you make as your own.) #:Erik -- @1999-07-22T00:37:33Z -- pi billion seconds since the turn of the century