LISPUSER

LISPMEMOQ: How can you tell when you've reached Lisp Enlightenment?
A: The parentheses disappear. -- Anonymous

(top)  (memo)  (rss)

Ltk with win32 - CLISP on Win32 で日本語 GUI

最近はお手軽な 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

(top)  (memo)  (rss)