ltk と Tk との接続

目次

管理者権限の無いマシンで Common Lisp の GUI 開発をする場合,GUI ツールキットをローカル・ディレクトリにインストールせざるを得ない.管理者権限の無いマシンで ltk を使う必要に迫られたので,Lisp コードからどのように Tk を呼び出しているのか調べてみた.

ltk は Tk インタプリタである wish を起動し,プロセス間通信を行っている.従って,ローカルインストールであろうと wish へのパスが通っていれば ltk は機能するはずだ.

もう少し細部を見てみよう.wish の起動は start-wish 関数内(GitHub 参照)の
(do-execute *wish-pathname* *wish-args*)GitHub 参照)で行われる.*wish-pathname* は以下のように設定されている(GitHub 参照).

(defvar *wish-pathname*
  #+freebsd "wish8.5"
  #-freebsd "wish")

したがって,*wish-pathname* にローカルインストールの wish へのパスを setf で設定しなおしても良いだろう.

wish の起動を担当する do-execute 関数は別のプロジェクトでも再利用可能な興味深い関数だ(GitHub 参照).この関数は,起動するプログラムと Lisp とを標準入出力を介してつなぐ stream を返す.このストリームの読み書きは read-wishsend-wish 関数が担っている.

余談だが, GTK+3 は CFFI を使って直接 C ライブラリを呼び出しているので,ソースコードから define-foreign-library を検索して必要なライブラリのファイルを自分で指定し直すか,ライブラリのロードパスを適切に設定すれば良いと思われる(まだ試していないが…​).