Introduction

ブログ内検索

  • このサイトの記事を検索 by Google

おすすめの一冊!

無料ブログはココログ

« クォート付きリストの罠 | トップページ | スパコンとグリッド »

2009-11-05

else 節のインデント

あいかわらず「On Lisp」のサンプルコードを xyzzy で打ち込んでます。

もちろん xyzzy の lisp-mode を使っています。
オートインデントや括弧の対応付けがあって、とっても便利♪

ただ、if 文のインデントにちょっと違和感があったりします。

(defun find2 (fn lst) (if (null lst) nil (let ((val (funcall fn (car lst)))) (if val (values (car lst) val) (find2 fn (cdr lst))))))
else 節の頭が then 節とずれているのがちょっと気持ち悪いのです。 ちょろっとググってみたところ、 Emacs Lisp の if 文は else 節が暗黙の progn になっていて、 Emacs の lisp-mode はそのためにわざとインデントをずらしているらしい。 でも、xyzzy は Emacs Lisp じゃなくて Common Lisp の処理系で、 Common Lisp の if 文は else 節としてひとつの文しかとれないのです。 「On Lisp」のサンプルコードだと else 節の頭は then 節とそろっているので、 たぶん Common Lisp の人たちはインデントを揃えているハズ。 というわけで、xyzzy の lisp-mode (lispmode.l) を眺めてみると、 なにやら if 文を特別扱いしているっぽい行がありました。
(setf (get 'if 'lisp-indent-hook) 2)
lisp/lispmode.l の 40 行目です。 この行をコメントアウト(行頭にセミコロンを挿入)して、 byte-recompile-directory して、Ctrl+Shift を押しながら xyzzy を起動させると、見事にインデントがそろいました! 我ながらすばらしい♪ というわけで、ちょっと幸せになりましたー

« クォート付きリストの罠 | トップページ | スパコンとグリッド »