複数のメジャーモードを文脈に応じて切り替え

multi-mode.elを使うと, 一つのバッファ内で文脈に応じてメジャーモードを切り替えることができる. けれど, カーソル位置を受け取って, 切り替えるべきメジャーモードとその有効範囲を返す関数を定義しないといけなくて, 使い方が難しい.

そこで, 開始・終了の正規表現と, その範囲内で有効になるメジャーモードを指定するとmulti-modeに渡すべき関数を作って登録してくれる関数を書いた.

続きを読む

最小限のJavaで素数を列挙(Javaで無限リスト)

以前書いた「ラムダ計算基礎文法最速マスター」では, ラムダ計算に自然数やデータ構造, 条件分岐, ループが用意されていないため, これらをラムダ項を使って模倣する方法を紹介しました. このようなことはどんなプログラミング言語でも起きうることで, たとえば, アセンブリ言語にforループが無いために, C言語で書かれたプログラムをアセンブリ言語コンパイルするときには条件ジャンプ命令とラベルでforループを模倣する, というのも同じことです.

今回は, Javaを最小限の機能だけに制限した純粋オブジェクト指向言語で, 以下のものを実現してみます.

  • 真偽値と条件分岐
  • 自然数と四則演算
  • リスト
  • 無限リスト

さらに, これらすべてを用いて任意個の素数を列挙するプログラムを書いてみます. 完全なソースコードは一番最後にあります.

続きを読む

はてなグループ日記でプレゼンモード

はてなグループのキーワードで使えるプレゼンモードはちょっとしたスライドを作るときにとてもべんり. でも, はてなグループを無料で使っているとキーワードはパブリックになってしまうので, あんまり馬鹿なスライドを作って公開してしまうわけにもいかない.

はてなグループの日記は無料で使っていても閲覧可能範囲を設定できるので, 日記をそのままプレゼンモードに切り替えるブックマークレットを書いてみた.

続きを読む

Emacsサーバを適切に終了する

emacs --daemon

でサーバを起動しておいて, 複数のターミナルウィンドウから

emacsclient -nw

することで, ターミナルモードでも単一のEmacsプロセスで複数フレームの編集ができる. これはとてもべんり. でもごく稀にサーバを再起動したいことがあって, killすればよいかと思ったら, ターミナルが崩れて悲惨なことになってしまった.

emacsclient -e '(kill-emacs)'

とすれば正常にサーバプロセスを停止できるけれど, これだといちいち

The current server still has clients; delete them? (yes or no)

と訊かれてしまう. 調べてみるとserver-kill-emacs-query-functionが呼ばれているせいらしいので, これをkill-emacs-query-functionsからremove-hookしてみたけれど, うまくいかない. 途方に暮れていると, Emacsのサーバ機能を実装している server.el のソースコードがこんなふうになっているのを見つけた:

...
;;;###autoload
(defun server-start (&optional leave-dead)
...
  (interactive "P")
  (when (or (not server-clients)
        ;; Ask the user before deleting existing clients---except
        ;; when we can't get user input, which may happen when
        ;; doing emacsclient --eval "(kill-emacs)" in daemon mode.
        (if (and (daemonp)
                 (null (cdr (frame-list)))
                 (eq (selected-frame) terminal-frame))
            leave-dead
          (yes-or-no-p
           "The current server still has clients; delete them? ")))
...
emacs.git - Git mirror of Emacs CVS repo

ハードコードされとる!

仕方ないので,

emacsclient -e '(progn (defun yes-or-no-p (p) t) (kill-emacs))'

とすることにした. ただし, 保存されていないバッファがあった場合のメッセージもおそらく表示されないので注意.

JavaScriptで読む「ラムダ計算基礎文法最速マスター」

以前書いた「ラムダ計算基礎文法最速マスター」(以下「最速マスター」)は, 予想以上に多くの人に興味を持ってもらえたようですが, 同時に難しくてわからなかったという人も多かったようです. 反響から察するに, 構文を見慣れていない(と錯覚してしまう)ことが理解の妨げになっていたように思います.

ラムダ計算の構文は, 実際には全く特殊なものではありません. このことがよくわかるように, 「最速マスター」のラムダ計算の簡約の例をすべてJavaScriptの構文で書いてみました.

......という内容になるはずでしたが, 気がついたらラムダ計算のインタプリタJavaScriptで実装していました! 実際に動かせるものは下記URLにあります.

続きを読む

GNU screenのウィンドウタイトルを自動設定

screenで開いているウィンドウの数が増えてくると, どれがどれだったか分からなくなってくる. かと言って, いちいちウィンドウに名前をつけるのも面倒. いまいるディレクトリや, 起動しているプログラムに応じて自動的に名前がついて欲しい.

zshを使っている限り, precmdとpreexecでなんとかなりそうだったのでやってみた.

  • フォアグラウンドにプログラムを実行中はそのコマンド名
    • ふつうは引数部分を含まない名前
    • 連想配列SCREEN_TITLE_CMD_ARGに値があれば, コマンド配列にその値をインデックスとしてアクセスした結果を使う
      • 例: SCREEN_TITLE_CMD_ARG=(ssh -1 man -1)
        (sshやmanのときは最後の引数を名前にする)
    • 連想配列SCREEN_TITLE_CMD_IGNOREに含まれているコマンドは無視
  • プロンプトが出ているときはカレントディレクト
続きを読む

ラムダ計算基礎文法最速マスター

ラムダ計算は, 多くのプログラミング言語, とくに関数型言語の原形になっています. ラムダ計算について理解しておくことは, 多くのプログラミング言語の習得に役立つでしょう.

ラムダ計算はチューリング完全で, 計算能力としてはふつうのプログラミング言語と同じです. ラムダ計算で計算を書く訓練をしておくことは, 任意の計算を関数のみを使って(他の制御構文を用いずに)書くときに役立ちます. ふつうに書いたら煩雑な処理を, 関数型言語のやり方で書くとすっきりすることが多々あり, コードを自由自在に書くためには必須の考え方と言えるでしょう.

続きを読む

imageLoaderをVimperatorから使う+α

d:id:tomo_snowbug:20090619:1245430454 のimageLoaderというGreasemonkeyスクリプトがなかなか素晴しいので, Vimperatorから使えるようにするついでに機能拡張してみた.

続きを読む