npt-japanese

% Function SET-DISPATCH-MACRO-CHARACTER, GET-DISPATCH-MACRO-CHARACTER

UP


Function SET-DISPATCH-MACRO-CHARACTER, GET-DISPATCH-MACRO-CHARACTER

Function SET-DISPATCH-MACRO-CHARACTER, GET-DISPATCH-MACRO-CHARACTER

構文

get-dispatch-macro-character disp-char sub-char &optional readtable => function
set-dispatch-macro-character disp-char sub-char new-function &optional readtable => t

引数と戻り値

disp-char - 文字
sub-char - 文字
readtable - readtable指定子。デフォルトは現在のreadtable
function - 関数指定子か、nil
new-function - 関数指定子

定義

set-dispatch-macro-characterは、 disp-charに続きsub-charが読み込まれたときに、 new-functionを呼び出すよう設定します もしsub-charが小文字のときは、 それは同等の大文字に変換されます。 もしsub-charが10進数の数字であったときはエラーです。

set-dispatch-macro-characterは、 特定のディスパッチマクロ文字のペアが読み込まれたときに、 new-functionが呼び出される機能を導入します。 new-functionreadtableが使用されているときに disp-charに続いてsub-charが続くときに そのディスパッチ関数が呼び出されるように導入されます。

new-functionがどのように起動されるかについて より多くの情報は2.1.4.4. マクロ文字をご確認ください。

get-dispatch-macro-characterは、 readtable内においてdisp-charsub-charに関連づいた ディスパッチ関数を検索します。

get-dispatch-macro-characterdisp-char配下のsub-charに対応する マクロ文字関数を返却するか、 あるいはsub-charに関連した関数が存在しなかったときは nilを返却します。 もしsub-charが10進数の数字のとき、 get-dispatch-macro-characternilを返却します。

例文

(get-dispatch-macro-character #\# #\{) =>  NIL
(set-dispatch-macro-character #\# #\{        ;#{の割り当て
   #'(lambda(s c n)
       (let ((list (read s nil (values) t)))  ;listは#n{の後のオブジェクトで
         (when (consp list)                   ;listのnthの要素を返却
           (unless (and n (< 0 n (length list))) (setq n 0))
           (setq list (nth n list)))
        list))) =>  T
#{(1 2 3 4) =>  1
#3{(0 1 2 3) =>  3
#{123 =>  123

もし#$foo(dollar foo)としたい場合

(defun |#$-reader| (stream subchar arg)
   (declare (ignore subchar arg))
   (list 'dollars (read stream t nil t))) =>  |#$-reader|
(set-dispatch-macro-character #\# #\$ #'|#$-reader|) =>  T

参考

2.1.4.4. マクロ文字

副作用

readtableは変更されます。

影響

*readtable*

例外

両関数において、disp-charreadtable内でディスパッチマクロ文字ではないとき エラーが発生します。

参考

*readtable*

備考

それらのsub-charを指定する前に make-dispatch-macro-characterを使用して、 ディスパッチ文字のセットアップを行う必要があります。


TOP, Github