#:g1: eggs: adviceの紹介

Posted 2014-04-23 15:30:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の114日目です。

eggs: adviceとはなにか

 eggs: adviceは、Felix L. Winkelmann氏作のChickenでADVICE機構を実現するライブラリです。

パッケージ情報

パッケージ名eggs: advice
Eggs
Eggsドキュメントadvice - The Chicken Scheme wiki

インストール方法

 UNIX系のOSでは、

$ sudo chicken-install advice

すれば、

(use advice)

で使えます。

試してみる

 eggs: adviceでも定番のbefore/after/aroundが提供されています。

(define (bamatu x)
  (format #t "~A~%" x))

(define bamatu-old bamatu)

(bamatu 42) ;=> 42

という定義がある場合、

(advise 'around bamatu
        (lambda (f args)
          (format #t "before~%")
          (f (car args))
          (format #t "after~%"))
        around:)

とすれば、

(bamatu 42)
;>> before
;>> 42
;>> after
;=> #<unspecified>

という風に使えます。
aroundはフック関数に、フックされる関数と引数リストが渡るようなインターフェイスになっています。
また、

(eq? bamatu-old bamatu)
;=> #t

のようです。

 外すには、

(unadvise bamatu around:)

のようにします。

 他、beforeとafterは、

(define (badialma x) x)

(badialma 42) ;=> 42

(advise 'before badialma (lambda (x) (format #t "before: args => ~A~%" x)) before:)

(badialma 42) ;>> before: args => (42) ;=> 42

(define (halito x) x)

(halito 42) ;=> 42

(advise 'after halito (lambda (x) (format #t "after: args => ~A~%" x) done:) after:)

(list (halito 42)) ;>> after: args => (42) ;=> 42

のような感じ。
after/around時の関数の返り値もオーソドックスな扱いかなと思います。

まとめ

 今回は、eggs: adviceを紹介してみました。
シンプルですが、大体のことはできそうです。

comments powered by Disqus