deferred.el リリース

先日の関西Emacsの会で発表しました deferred.el です。
deferred.el はEmacs Lispでの非同期処理を書きやすくするためのライブラリです。

(2010/10/08 追記:コンパイルできないバグがありますので修正中です。コンパイルしなければとりあえず動きます。。。)
(2010/10/08 追記:コンパイル出来るようになりました。毎回ミスばっかりですみません。)

入手・ドキュメント

以下のGutHubの日本語ドキュメントの方に一通り書いてみました。

そのうち頑張って英語に直したいと思っています。(手伝ってもらえると助かります><)

ドキュメント目次
  • インストール
  • 使い方例
  • インタフェース解説
    • 関数
    • 実行・接続
  • ポイント

deferred.el デモ:慣性スクロール

ライブラリなのでdeferred.elを単体でインストールしただけでは何も起きません。deferred.elのデモとして慣性スクロールを作りましたので、プログラムが分からなくてもそちらでお楽しみいただけるかもしれません。

auto-install.elを持っている人は、以下を評価してdeferred.elとinertial-scroll.elをインストールします。

(auto-install-from-url "http://github.com/kiwanami/emacs-deferred/raw/master/deferred.el")
(auto-install-from-url "http://github.com/kiwanami/emacs-inertial-scroll/raw/master/inertial-scroll.el")

手動で入れる場合は、以下のリンク先をload-pathに保存してください。

その後、以下のコードを評価することで慣性スクロールが有効になります。スクロールのキーを押すと、あたかもMacのようにオシャレ(若干無理がある)にスクロールします!!!

(require 'inertial-scroll)
(setq inertias-global-minor-mode-map 
      (inertias-define-keymap
       '(
         ("<next>"  . inertias-up)
         ("<prior>" . inertias-down)
         ("C-v"     . inertias-up)
         ("M-v"     . inertias-down)
         ) inertias-prefix-key))
(inertias-global-minor-mode 1)

以下のような動き(機能)をします。

  • スクロール速度は摩擦力による抵抗で減衰
  • スクロールキーを連打すると加速
    • →一気に遠くに行ける、大体連打数の2乗で距離が伸びる
  • スクロール中に逆方向を押すとブレーキ
    • →いきなり速度0でなくて、急ブレーキ(細かい!)
  • バッファ端で画面フラッシュ&バウンド
    • バウンドはさすがに使いにくいのでいやだったら止めることが出来ます
  • スクロール中もブロックしないので操作できます
    • 複数ウインドウで同時にスクロール!!

キモイ!止めて!と思ったら、以下のコードを評価すると止まります。

(inertias-global-minor-mode -1)

一応、自分のところでは以下のパラメーターで使っていますが、スクロール量を微調整できるためかなり重宝しています。

(setq inertias-initial-velocity 50) ; 初速(大きいほど一気にスクロールする)
(setq inertias-friction 120)        ; 摩擦抵抗(大きいほどすぐ止まる)
(setq inertias-rest-coef 0)         ; 画面端でのバウンド量(0はバウンドしない。1.0で弾性反発)
(setq inertias-update-time 60)      ; 画面描画のwait時間(msec)

応用例

今のところ、以下のものがあるようです。

非同期が必要になる場面は多く、適用範囲は広いと思いますので、今後皆さんのお役に立てるといいかなと思っています。

その後

まだ出来て間もないですので、本格的なアプリへの適用はこれからになります。今後自分のアプリを書き換えていく予定です。並列実行モデルが実現できたことで、早速もう少し高レベルなライブラリ(スレッドとかセマフォとかデータフローとか)が必要だと思っていて、concurrent.el なるものを作っています。もう少ししたら紹介できると思います。

今後若干仕様が変わることがあるかもしれません。まず、WebアクセスはJavaScriptの一般的なAjax関数のように使いやすくしておきたいと思います。また、メソッドチェインのあたりがちょっとダサイような気がしています。よりよい記述の仕方についてアイデアがもしあれば教えてください。

ということで deferred.el の紹介でした。今後、以下のようなシリーズが続く予定です。
気力が尽きたら続かないかもしれません。。。

  • deferred.el のできるまで:Emacsでの非同期処理
    • Emacsでの現状の非同期について調べてみました
  • deferred.el のできるまで:調査、設計と実装
    • 元になった他言語の非同期の実装、JavaScript の非同期ライブラリなどの調査
  • deferredと継続渡し、遅延実行、そして無限
    • deferredと一緒に出てくることが多い「継続」「遅延実行」「無限リスト」などのもやもやについて考えてみた