もう一つの 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 件のコメント:
コメントを投稿