(top)  (memo)  (rss)
最近はお手軽な Lisp 用の GUI ツールキットとして Ltk の人気が高いようで す.たしかに SLIME を使いながら気軽に GUI が試せるので小物に UI をつけ るにはかなり便利です.今回は CLISP 2.38 on Win32 と ActiveTcl で日本語 が使えるか試してみました.
ActiveTcl は Windows 上ではファイルの入力として SHIFT-JIS 形式の文字列 を受けます.今回使用した私の CLISP の設定がファイル IO と,SLIME との通 信につかう swank::*coding-system* が UTF-8 な設定です.
CL-USER> system::*default-file-encoding* #<ENCODING UTF-8 UNIX> CL-USER> swank::*coding-system* :utf-8-unix CL-USER> system::*foreign-encoding* #<ENCODING CP932 DOS> CL-USER> system::*misc-encoding* #<ENCODING CP932 DOS> CL-USER> system::*pathname-encoding* #<ENCODING CP932 DOS> CL-USER> system::*terminal-encoding* #<ENCODING CP932 DOS>
;; このファイルは UTF-8 で書かれています.
(in-package :ltk)
(defun hello-1 ()
(with-ltk ()
(let ((s (wish-stream *wish*))
(i (two-way-stream-input-stream s))
(o (two-way-stream-output-stream s)))
(system::set-stream-external-format i charset:cp932)
(system::set-stream-external-format o charset:cp932))
(let ((b (make-instance 'button
:master nil
:text "日本語"
:command (lambda () (format t "こんにちは世界!~&")))))
(pack b))))
(hello-1)
で,このままだと文字化けが発生しました.wish84.exe へファイルを入力して 試したところ,どうやら日本語としては cp932 (SHIFT-JIS) を受けつけるようです.
そこで,ltk の初期化時のフックで,ltk と通信しているストリームを cp932 エンコーディング (SHIFT-JIS) へと変更してやります.
;; このファイルは UTF-8 で書かれています.
(in-package :ltk)
#+or clisp win32)
(defun wish-enable-japanese ()
(let* ((s (wish-stream *wish*))
(i (two-way-stream-input-stream s))
(o (two-way-stream-output-stream s)))
(system::set-stream-external-format i charset:cp932)
(system::set-stream-external-format o charset:cp932)))
#+(or clisp win32)
(pushnew 'wish-enable-japanese *init-wish-hook*)
;; hook への関数登録はあえて ' を使う.#' を使うとコンパイルする度に増えていってしまう…
(defun hello-1 ()
(with-ltk ()
(let ((b (make-instance 'button
:master nil
:text "日本語"
:command (lambda () (format t "こんにちは世界!~&")))))
(pack b))))
(hello-1)
これで無事日本語のボタンが表示できました.一歩前進〜.
posted: 2006/02/25 23:57 | permanent link to this entry | Tags: LISP