macrostep 20161120.1306(in MELPA)
interactive macro expander

概要

Lispのマクロはとても強力で、制御構造すら隠蔽できてしまいます。

もちろんelispだって例外ではありません。

マクロは何度も「展開」され、
最終的にはスペシャルフォームと関数のみになります。

マクロは便利さの反面、デバッグが困難になるという代償が伴います。

マクロのデバッグの際には展開の様子を見ていくのがいいです。

マクロがどのように展開されるかについては
macroexpand という関数を使えばわかりますが、
デバッグの際に使おうにもわざわざコピーして貼り付けるのでは面倒です。

macrostep.el は、emacs-lisp-modeのバッファの中で
その場でマクロ展開の様子を見られるようにします。

macroletcl-macrolet によるローカルマクロにも対応しています。

elispプログラマならば常備したいところです。

インストール

パッケージシステムを初めて使う人は
以下の設定を ~/.emacs.d/init.el の
先頭に加えてください。

(package-initialize)
(setq package-archives
      '(("gnu" . "http://elpa.gnu.org/packages/")
        ("melpa" . "http://melpa.org/packages/")
        ("org" . "http://orgmode.org/elpa/")))

初めてmacrostepを使う方は
以下のコマンドを実行します。

M-x package-install macrostep

アップグレードする方は、
以下のコマンドでアップグレードしてください。
そのためにはpackage-utilsパッケージが必要です。

M-x package-install package-utils (初めてアップグレードする場合のみ)
M-x package-utils-upgrade-by-name macrostep

使い方

C-c eを押してマクロ展開状態にします。

この状態で以下のキーが使えます。

  • e - さらに展開
  • u - 展開した部分を閉じる
  • p - 次のマクロを選択する
  • n - 前のマクロを選択する
  • q - macrostepを終了する

C-c e e ...と操作すると最終的にはマクロが
すべて展開された状態が見られます。

理解できないマクロを展開するのに使ってみてください。

知ってました?
defunって実はdefaliasで定義されたマクロなんですよ!!

20150502050552.png
Fig1: 初期状態

20150502050557.png
Fig2: C-c eでマクロを1段階展開!

20150502050609.png
Fig3: pやnで次に展開するマクロを選択できる

20150502050632.png
Fig4: dolistをさらに展開

20150502051548.png
Fig5: macroletやcl-macroletで定義されたローカルマクロにも対応!

20150502051554.png
Fig6: C-c eで展開!

設定 150502050134.macrostep.el(以下のコードと同一)

(define-key emacs-lisp-mode-map (kbd "C-c e") 'macrostep-expand)

実行方法

$ wget http://rubikitch.com/f/150502050134.macrostep.el
$ emacs -Q -f package-initialize -l 150502050134.macrostep.el


本日もお読みいただき、ありがとうございました。参考になれば嬉しいです。