[Openmcl-devel] make-symbol with uppercase/lowercase strings --

Pascal J. Bourguignon pjb at informatimago.com
Mon Jan 14 15:37:59 PST 2013

Dave Cooper <david.cooper at genworks.com> writes:

>     >
>     >  CL-USER> (make-symbol "heynow")
>     > #:|heynow|
>     > CL-USER> (make-symbol "HEYnOW")
>     > #:HEY\nOW
>     > CL-USER> (make-symbol "HEYnoW")
>     > #:|HEYnoW|
>     Which part of above bothers you?  CCL is making symbols with name
>     you gave it.  To print them correctly some escaping (either
>     vertical bars or backslahes) is needed.  Apparently CCL chooses
>     shortest correct form, with ties in favour of bars -- in your
>     case uses backslash when only one character needs escaping
>     but bars otherwise.
> None of it particularly bothers me. I was just wondering if there was
> some kind of pattern I was missing here.
> CL-USER> (make-symbol "AAbBABABaBABBAcBA")
> So it doesn't look like it's as simple as the shortest correct form. 
> I tried looking at CCL's source for make-symbol, but it lost me at
> symvector->symptr...
> Anyway it's enough to know that both printed representations are
> correct... so I'll go ahead and make my code deal with that. 

For more fun try:

(loop for *print-case* in '(:upcase :downcase :capitalize)
       do (loop for rtc in '(:upcase :downcase :preserve :invert)
             do (let ((*readtable* (copy-readtable nil)))
                  (setf (readtable-case *readtable*) rtc)
                  (format t "~:@(~16S ~16S~) ~{~16S~^ ~}~%"
                          *print-case* (readtable-case *readtable*)
                           '(HELLO |hello| |Hello| \hello)))))

(and that's not all you can do, *print-escape*, *print-circle* and
*package* have also an impact on the way symbols are printed).

__Pascal Bourguignon__                     http://www.informatimago.com/
A bad day in () is better than a good day in {}.

More information about the Openmcl-devel mailing list