#:g1: anaphoraの紹介

Posted 2014-01-01 15:00:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の2日目です。

anaphoraとはなにか

 On Lispで有名になった「itで前方の変数を参照できるアナフォリックマクロ」のみを集めたユーティリティ集です。

パッケージ情報

パッケージ名anaphora
Quicklisp
公式サイトhttp://common-lisp.net/project/anaphora/
CLiKihttp://cliki.net/anaphora
Quickdocshttp://quickdocs.org/anaphora

インストール方法

(ql:quickload :anaphora)

試してみる

 どんな関数があるかは、Quickdocsで確認できます。

(aif "hello"
    it)
;=>  "hello"
(aif (+ 1 1)
    (+ 1 it)
    :never)
;=>  3

メジャーなaifにとどまらず、sifというものを導入しているのが特色です。
これは、itをシンボルマクロにすることによって、setf等で参照する場所の読み書きを可能にするものです。

(let ((x (list t)))
  (sif (car x)
       (setf it :yes!)
       (setf it :oops))
  (car x))
;=>  :YES!

これをマクロ展開してみると

(LET ((X (LIST T)))
  (SYMBOL-MACROLET ((THIS-S3505
                     (ANAPHORA::INTERNAL-SYMBOL-MACROLET ((IT THIS-S3504))
                                                         (CAR X)))
                    (IT THIS-S3505))
    (IF (SYMBOL-MACROLET ((IT THIS-S3504))
          (CAR X))
        (LET* ((X3507 X))
          (MULTIPLE-VALUE-BIND (NEW3506)
              :YES!
            (SYMBOL-MACROLET ((IT THIS-S3504))
              (SB-KERNEL:%RPLACA X3507 NEW3506))))
        (LET* ((X3509 X))
          (MULTIPLE-VALUE-BIND (NEW3508)
              :OOPS
            (SYMBOL-MACROLET ((IT THIS-S3504))
              (SB-KERNEL:%RPLACA X3509 NEW3508))))))
  (CAR X))

こんな感じ。
then部はシンボルマクロになって欲しくない場合は、asifというものが使えます。

(asif (gethash key table)
      (foo it)       
      (setf it default))

マクロ展開:

(LET ((IT (GETHASH KEY TABLE)))
  (IF IT
      (FOO IT)
      (SYMBOL-MACROLET ((THIS-S3532
                         (ANAPHORA::INTERNAL-SYMBOL-MACROLET ((IT THIS-S3528))
                                                             (GETHASH KEY
                                                                      TABLE)))
                        (IT THIS-S3532))
        (LET* ((G3533 KEY) (G3534 TABLE))
          (MULTIPLE-VALUE-BIND (G3535)
              DEFAULT
            (SYMBOL-MACROLET ((IT THIS-S3528))
              (PROGN NIL (SB-KERNEL:%PUTHASH G3533 G3534 G3535))))))))

この例の場合、

(sor (gethash key table) (setf it default))

でもOK。
色々できますね。

anaphoraの紹介/関連記事等

まとめ

 今回は、anaphoraを紹介してみました。
好きな人は大好きなアナフォリックマクロ。
ちなみにOn Lispを読んだ人には意外かもしれないですが、実際のコードでの利用数はそれ程でもないです。

comments powered by Disqus