独自マクロを気兼ねなく使う

リーダマクロは他に与える影響が大きいので、エディタのスクリプトとして動いているxyzzy上では使いにくい。
しかし、使わないのではもったいないので、うまく使う方法を考える。


リーダは*readtable*に定義されているので、自分のコードを読み込むときだけ*readtable*を置き換えてやれば良い。

;;; 適当なファイルに書いて読み込む
(in-package "editor")
(defvar-local *local-readtable* *readtable*)
(export '(*local-readtable*))

(unless (fboundp 'eval-region@old)
  (setf (symbol-function 'eval-region@old) #'eval-region))
(defun eval-region (from to &optional stream)
  (interactive "r")
  (let ((*readtable* *local-readtable*))
	(funcall #'eval-region@old from to stream)))

(in-package "user")
;;; ここまで

(setf *my-readtable* (copy-readtable))
;*my-readtable*を変更する(略)

;バッファ内で実行
(setq *local-readtable* *my-readtable*)

これで、バッファ内でC-x C-eなどを呼び出したときに独自のリーダが使える。リーダマクロはリード時に展開されてしまうので、コマンドなどには影響しないと思う。


loadやbyte-compile-fileするときは別の関数なので、それぞれ定義を上書きするなどして置き換えれば良いだろう。
実際の影響などは良く理解していないので、今日はメモ程度で。