Posted 2020-04-18 20:41:27 GMT
CLでSRFI、今回移植したのは、SRFI 173: Hooksです。
srfi-173は、古典的なLispでお馴染の機構であるフック機構を実現しようというものです。
参照実装をコピペしただけです。
元がシンプルなので特にソースコードを変更する必要もありませんでした。
テストコードにも手を加えないことにしようかとも思いましたが、テストケースが数個だったのでfiveamの形式にササッと書き直しました。
advice機構のように関数名(シンボル)に関数をぶらさげるのではなく、フックオブジェクトに関数をどんどん登録していきます。
各フックの起動順は不定。フック起動結果の値も不定。
リストに関数をプッシュしていって後で順に呼び出しするのとあまり変らない使い勝手です。
(defvar *hook* (make-hook 0))(defun one () (print 1))
(defun two () (print 2))
(defun three () (print 3))
(progn
(hook-add! *hook* #'one)
(hook-add! *hook* #'two)
(hook-add! *hook* #'three))
→ (#<Function three 40D005342C>
#<Function two 40D00533C4>
#<Function one 40D005335C>
#<Function three 40D005342C>
#<Function two 40D00533C4>
#<Function one 40D005335C>)
(hook-run *hook*)
▻
▻ 3
▻ 2
▻ 1
→ nil
Ultralispに登録してみたので、
(ql-dist:install-dist "http://dist.ultralisp.org/")
してあれば、
(ql:quickload :srfi-173)
でインストール可能です。
■
HTML generated by 3bmd in LispWorks 7.1.2