[Openmcl-devel] Slime's utf-8-unix

Ben Hyde bhyde at pobox.com
Fri Oct 27 07:10:01 PDT 2006


On Oct 27, 2006, at 12:20 AM, Gary Byers wrote:
> On Thu, 26 Oct 2006, Ben Hyde wrote:
>> Here's how I got openmcl's unicode support working with slime and
>> xemacs.
>>
>> In my lisp init I modified the how it should fire up openmcl.
>>
>> (setf slime-lisp-implementations
>>       '((openmcl
>> 	 ("/Users/bhyde/bin/openmcl" "--terminal-encoding" "utf-8")
>> 	 :coding-system utf-8-unix)
>> 	(sbcl
>> 	 ("sbcl")
>> 	 :coding-system utf-8-unix)))
>>
>> I also define a m-x command:
>>
>> (defun openmcl () (interactive)
>>   (let ((slime-default-lisp 'openmcl)) (slime)))
>>
>> Then I taught swank that how to deal with swank's utf-8-unix coding-
>> system by replacing accept-connection's implementation in swank-
>> openmcl.lisp:
>>
>
> Another approach might be to change the call to MAKE-SOCKET in the  
> version
> of SWANK:CREATE-SOCKET in swank-openmcl.lisp (adding :EXTERNAL- 
> FORMAT :UTF-8
> to the arglist.)  That'd save having to bind the special variables,  
> but
> since the rest of SLIME apparently thinks that it's reasonable to  
> specify
> :EXTERNAL-FORMAT at accept time it might be better to make  
> CCL:ACCEPT-CONNECTION
> accept an :EXTERNAL-FORMAT argument.
>
> It's not really clear that that'd be otherwise useful; I tend to  
> think that
> you'd want all streams created from the same listening socket to  
> use the same
> external-format (at least initially).  (If you thought  
> that :EXTERNAL-FORMAT
> should be specified at accept time, how about other arguments that  
> apply to
> the stream socket, like :KEEPALIVE ?)  Perhaps there's some  
> rationale for
> SWANK doing things this way, but it seems wrong to the extent that  
> I've thought
> about it.

In the HTTP world the character set is very volatile.  Coming from  
that world my first attempt was to slam the encoding just after the  
accept.  At this moment I'm actually a bit unclear on how to do that  
in a safe and reliable manner.

Those files, swank-*.lisp, are certainly lesson in how much variation  
there about how to handle this.  If you want to maximize the number  
of libraries that are rapidly brought into openmcl then following a  
market leader's design might be the best option.  At least then you  
can blame the tangle of design choices on them.

>> (defimplementation accept-connection (socket
>>                                       &key external-format buffering
>> timeout)
>>   (declare (ignore buffering timeout))
>>   (let ((ef (or external-format :iso-latin-1-unix)))
>>     (cond
>>       ((eq external-format :utf-8-unix)
>>        (let ((ccl:*default-socket-character-encoding* :utf-8)
>>              (ccl:*default-line-termination* :unix))
>>          (ccl:accept-connection socket :wait t)))
>>       (t
>>        (assert (eq ef :iso-latin-1-unix))
>>        (ccl:accept-connection socket :wait t)))))
>
> One (very dumb, very simple) way of testing that the connection is  
> using utf-8
> is to try something like:
>
> whatever-the-lisp-prompt-is> (format t "~a~%" #\Plus-Minus_Sign)
>
> If you see a glyph comprised of plus sign over a minus sign, you're  
> winning (most
> fonts - on OSX at least - seem to contain a glyph for that character.)

On OSX, if you enable the menu bar widget for "input menu" in the  
international control panel then you get easy access to the character  
pallet; where you can find all manner of amusing unicode character  
codes quickly and easily.  And, if the gods are smiling on you, you  
can cut and paste to test round trip unicode.

Another technique is to fetch a page or feed from the country of your  
choice.

> If you see something else (and you're sure that the terminal/Emacs  
> is using utf-8),
> then it's likely that the lisp is not using utf-8 ...
>
>> I haven't tested this much, and presumably somebody who actually is
>> fluent in swank and openmcl external coding would have done something
>> different.
>
> It'd probably be good - once some dust settles - to make utf-8 the  
> default;
> getting Slime to support it would settle a lot of that dust.

Absolutely!  Unicode support in the emacs world is just as tangled as  
it is in the lisp world.  Dust would come out of both sides.

  - ben




More information about the Openmcl-devel mailing list