#:g1: cl-hooksの紹介

Posted 2014-04-26 15:00:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の117日目です。

cl-hooksとはなにか

 cl-hooksは、Jan Moringen氏作の関数やオブジェクトにフック機構を実現するライブラリです。

パッケージ情報

パッケージ名cl-hooks
Quicklisp
参考サイト
CLiKihttp://cliki.net/cl-hooks
Quickdocshttp://quickdocs.org/architecture.hooks

インストール方法

(ql:quickload :cl-hooks)

試してみる

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

 cl-hooksは、既存の関数の実行や、変数の呼び出しにフックを掛けるというものではなく、新しくフックの枠組みを提供するもののようです。

(defvar *my-hook* nil
  "My hook is only run for educational purposes.")

(hooks:add-to-hook '*my-hook* (lambda (x) (format t "my-hook called with argument ~S~%" x)))

(hooks:run-hook '*my-hook* 1) ;>> my-hook called with argument 1 ;>> ;=> NIL

(documentation '*my-hook* 'hooks::hook) ;=> "My hook is only run for educational purposes."

(defclass my-class () ((my-hook :initarg :my-hook :type list :initform nil :documentation "This hook bla bla")))

(defvar *my-object* (make-instance 'my-class))

(hooks:object-hook *my-object* 'my-hook) ;=> #<HOOKS:OBJECT-HOOK MY-HOOK PROGN (0) {101D5E9B43}>

(hooks:add-to-hook (hooks:object-hook *my-object* 'my-hook) (lambda (x) (format t "my-hook called with argument ~S~%" x))) ;=> #<FUNCTION (LAMBDA (X)) {101DD3271B}> ; NIL

(hooks:object-hook *my-object* 'my-hook) ;=> #<HOOKS:OBJECT-HOOK MY-HOOK PROGN (1) {101D5E9B43}>

(hooks:run-hook (hooks:object-hook *my-object* 'my-hook) 1) ;>> my-hook called with argument 1 ;>> ;=> NIL

(documentation (hooks:object-hook *my-object* 'my-hook) 'hooks::hook) ;=> "This hook bla bla"

(defparameter *external-hook* (hooks:external-hook *my-object* 'my-external-hook)) ;=> *EXTERNAL-HOOK*

(hooks:external-hook *my-object* 'my-external-hook) ;=> #<HOOKS:EXTERNAL-HOOK MY-EXTERNAL-HOOK PROGN (0) {101E580E33}> ; T

(hooks:add-to-hook *external-hook* (lambda (x) (format t "my-external-hook called with argument ~S~%" x))) ;=> #<FUNCTION (LAMBDA (X)) {101F26CDAB}> ; NIL

(hooks:run-hook *external-hook* 1) ;>> my-external-hook called with argument 1 ;=> NIL

上記のコード例のように、フックは、関数にもオブジェクトにも掛けられますが、別個に管理するとなると、予めフックを掛けることになりそうなので、既存のシステムに取り入れたりするのは難しそうです。
また、フックの呼び出し方も通常の関数呼び出しの書法と微妙に異なり、cl-hooksの流儀に従わないといけない感があります。
ちなみに、cl-hooksのフックには色々機能が盛り込まれていて、ドキュメンテーションが付けられたり、メソッドコンビネーションのようなものもあります。詳しくはドキュメントを参照してください。

まとめ

 今回は、cl-hooksを紹介してみました。
やはり、フック系の機構は既存のものに付け加えたいもののように思われますが、設計段階からある程度想定できる場合は、便利だったりするのかもしれません。

comments powered by Disqus