#:g1: CMUCL: fwrappersの紹介

Posted 2014-09-05 14:45:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の248日目です。

CMUCL: fwrappersとはなにか

 CMUCL: fwrappersは、CMUCLが提供する関数へのラッパー(アドバイス)機能です。

パッケージ情報

パッケージ名CMUCL: fwrappers
ドキュメントDesign Choices and Extensions: Function Wrappers

インストール方法

 CMUCL 18e以降のバージョンでは標準機能として使えます。

試してみる

 用意されているユーティリティは

のようなところですが、Allegro CLのfwrapperに名前も機能も似ています。

大体のところは同じなのですが、CMUCLの場合コンパイル時とインタプリタ時での動作が微妙に違っているようです。また、スペシャル変数に関数を入れて呼び出したりしてもラッパーが効かなかったりします。

(defun bamatu (x)
  (format t "~A~%" x))

(defvar *bamatu-old* #'bamatu)

(funcall *bamatu-old* 42) ;>> 42 ;>> ;=> NIL

(fwrappers:define-fwrapper bamatu-wrapper (x) (format t "before~%") (fwrappers:call-next-function) (format t "after~%"))

(bamatu 42) ;>> 42 ;>> ;=> NIL

(fwrappers:fwrap 'bamatu 'bamatu-wrapper :type 'w1) ;=> NIL

(bamatu 42) ;>> before ;>> 42 ;>> after ;>> ;=> NIL

(fwrappers:list-fwrappers 'bamatu) ;=> (#<FWRAPPERS:FWRAPPER W1 {5927DA89}>)

(fwrappers:fwrap 'bamatu 'bamatu-wrapper :type 'w2) ;=> NIL

(bamatu 42) ;>> before ;>> before ;>> 42 ;>> after ;>> after ;>> ;=> NIL

(fwrappers:list-fwrappers 'bamatu) ;=> (#<FWRAPPERS:FWRAPPER W2 {59BC93D1}> #<FWRAPPERS:FWRAPPER W1 {5927DA89}>)

(fwrappers:funwrap 'bamatu :type 'w1) ;=> NIL

(bamatu 42) ;>> before ;>> 42 ;>> after ;>> ;=> NIL

(fwrappers:list-fwrappers 'bamatu) ;=> (#<FWRAPPERS:FWRAPPER W2 {59BC93D1}>)

(eq *bamatu-old* #'bamatu) ;=> T

(bamatu 42) ;>> before ;>> 42 ;>> after ;>> ;=> NIL

(funcall #'bamatu 42) ;>> 42 ;>> ;=> NIL

(funcall *bamatu-old* 42) ;>> 42 ;>> ;=> NIL

(defun mahalito () (funcall #'bamatu 42))

(defun mogref () (funcall *bamatu-old* 42))

(mahalito) ;>> before ;>> 42 ;>> after ;>> ;=> NIL

(mogref) ;>> 42 ;>> ;=> NIL

まとめ

 今回は、CMUCL: fwrappersを紹介してみました。
SBCLでは、encapsulateが似たような機能を提供していますが、これは、CMUCLでfwrapperより前に提供されていた機能みたいです。この辺りも調べてみたいところ。

comments powered by Disqus