一時的にリードテーブルを変更して読み込む - lisp-cookbook-ja/common-lisp GitHub Wiki

マクロ FIXME

一時的にリードテーブルを変更して読み込む

一時的にリードテーブルを変更するには様々は方法が考えられますが、何がリード時に作用するのかを良く考える必要があるでしょう。 下記の例では、一時的に!をquoteに定義してみています。

(let ((*readtable* (copy-readtable))) ;引数を省略するとカレントのものが渡る
  (set-syntax-from-char #\! #\')
  (eval (read-from-string "!(foo bar baz)")))
;=> (FOO BAR BAZ)

その他の例

(progn
  #.(defparameter *rt* *readtable*) ;リード時に作用
  #.(set-syntax-from-char #\! #\')  ;リード時に作用

  (prog1 !(foo bar baz)
         #.(setq *readtable* (copy-readtable *rt*)))) ;リード時に作用
;=> (FOO BAR BAZ)