/home/matstani/weblog

programming log.

Clojureアプリケーションを動的に書き換える

nREPLサーバをClojureアプリケーションに組み込んでおくと、動作中のClojureアプリケーションに接続して、デバッグを行ったり、動作を書き換えたりすることができます。

試しに、デスクトップGUIアプリケーションを動的に書き換えてみます。
Clojureからは、JavaのSwingを直接利用できますが、せっかくなので、よりClojureっぽく書けるSeesawを使ってみます。

project.cljは以下のとおり。

アプリケーションのコードは以下のとおり。

6行目でnREPLサーバを起動しています。

アプリケーションを起動

1
$ lein run

以下のようなウィンドウが表示されます。

ウィンドウ

「Show Message」ボタンを押すとメッセージが表示されます。

ウィンドウ

このアプリケーションにnREPLクライアントで接続し、動作を書き換えてみます。
nREPLクライアントとして、nrepl.elを利用する場合、Emacs内で以下のコマンドを実行します。

1
2
3
M-x nrepl
Host: 127.0.0.1
Port: 7888

Portで指定するのは、アプリケーション中のstart-serverで指定したポート番号です。 以下のようにnREPLプロンプトが表示されます。

1
2
; nREPL 0.1.7
user> 

表示されるメッセージを変化させてみます。

1
2
user> (in-ns 'nrepl-test.core) ;namespaceセット
nrepl-test.core> (def msg "Changed Message.") ;msgを再定義

ボタンを押すと、メッセージが変化します。

ウィンドウ

ログ機能を付けてみます。

1
2
3
4
nrepl-test.core> (let [old show-msg-actn]
    (defn show-msg-actn
        [e]
        (println "LOG: show-msg-actn") (old e))) ;show-msg-actnを再定義

ボタンを押すと、コンソールにログが表示されるようになりました。

Comments