[Openmcl-devel] Slime's utf-8-unix
Gary Byers
gb at clozure.com
Thu Oct 26 21:20:32 PDT 2006
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.
> (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.)
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.
More information about the Openmcl-devel
mailing list