Hatena::Groupcadr

kozima の日記

2010-05-18

anything を触ってみた

| 22:53

初めて自分で anything をカスタマイズしてみました。というか今までほとんど使ってなかったんですけど。

(defvar anything-c-source-shell-command-history
  '((name . "Shell Commands History") (candidates . shell-command-history)
    (action . (lambda (command)
                (let ((name (concat "shell: " command)))
                  (start-process-shell-command name nil command))))))
(add-to-list 'anything-sources
             'anything-c-source-shell-command-history)

anything-sources の documentation と anything-config.el 見ながら適当に書いたら,わりと簡単に動くものができてうれしい。

外側を書き換えるマクロ

| 22:35

特に深い考えもないのですが。

普通のマクロは,呼び出しより下にある構文木を書き換えます。*1

;; 特に意味はない例
(defmacro my-macro (arg) `(print ',arg))

(if (listen) (my-macro 42))
;; == (if (listen) (print '42))

じゃあなんか呼び出しの上のほうを書き換える機構があってもいいんじゃないかみたいな。

(defmacro* my-macro* (context) (context '42))

(if (listen) (print my-macro*))
;; == (if (listen) (print '42))
;; context に (lambda (x) `(if (listen) (print ,x))) のようなものが渡される気分
;; (macrolet ((m (x) `(if (listen) (print ,x)))) (m '42)) と同じ?

何に使えるのかよく分かりませんが,きっとその手の思考力がある人なら変態的なことができそうなので,そういう能力があって暇な人は使い道を見つけると楽しいんじゃないでしょうか。

*1:構文木を書き換えるというより,生成すると言ったほうが適切?