(defparameter *scheme-procs* '(+ - * / abs sqrt sin cos atan = < > <= >= cons car cdr not append list member (read scheme-read) random name! (null? null) (eq? eq) (equal? equal) (eqv? eql) (compile scheme-compile) (exit scheme-exit) (number? numberp) (even? evenp) (odd? oddp) (write prin1) (display princ) (newline terpri)))通常の状態で使っているリードマクロは,copy-readtable でコピーすることができます. リードテーブルは,利用可能な全文字ごとに 読み込み方を定義している関数を定義する関数を 登録してあるものです. この表の中で,#で始まり,その次に続く文字に 対応する関数を置き換える手続きとして, set-dispatch-macro-characterという関数が 用意されています. 新しく置き換えを行ったリードテーブルを 利用して通常のread手続きを行うには, 大域変数の*readtable*をその新しいリードテーブルに 局所的に置き換えて実行するということで 可能となります.その局所的置き換えには, letを使うことができます.letから抜ければ 通常のリードテーブルを利用することになります.
(defvar *scheme-readtable* (copy-readtable)) (defun scheme-read (&optional (stream *standard-input*)) (let ((*readtable* *scheme-readtable*)) (read stream))) (set-dispatch-macro-character #\# #\t #'(lambda (&rest ignore) t) *scheme-readtable*) (set-dispatch-macro-character #\# #\f #'(lambda (&rest ignore) nil) *scheme-readtable*)