2010/10/11

もう一つの Tilde for SBCL のやり方 (sb-int:encapsulate)

Tilde for SBCL convenience にて SBCL で ~/xxx なパスを扱う方法が紹介されています。そこでは sb-impl::parse-namestring を上書きするようにして実装されています。

もう一つの方法として sb-int:encapsulate を使って ~/xxx なパスを扱えるようにしてみます。 sb-int:encapsulate については FUNCTION ENCAPSULATION IN SBCL で紹介されています。

(sb-int:encapsulate
'open :~
'(let* ((filename (car sb-int:arg-list))
(namestring (typecase filename
(pathname (namestring #p"~/a"))
(t filename))))
(when (and (<= 2 (length namestring))
(string= "~/" namestring :end2 2))
(setf (car sb-int:arg-list)
(merge-pathnames (subseq namestring 2) (user-homedir-pathname))))
(apply sb-int:basic-definition sb-int:arg-list)))

(with-open-file (in "~/.sbclrc")
(read-line in))

(with-open-file (in #p"~/.emacs")
(read-line in))

;; 元に戻すには↓
(sb-int:unencapsulate 'open :~)

こんな具合に sb-int:encapsulate を使えば既存の関数をくるみこんで、振舞いを変えてやることができます。

0 件のコメント: