next up previous
Next: 1.4 バインディング情報の表現 Up: 1.3 変数の定義 Previous: 1.3.1 ?で始まる変数の判定

1.3.2 任意のシンボルを変数に宣言する方法

?で始まるというように決めるのではなく, シンボルを変数として宣言するという方法も考えられます. ここでは,シンボルの属性リストを利用して,

(defun init-matching-variables (vars)
  (dolist (v vars vars)
          (setf (get v 'variable-p) t)))
(defun clear-matching-variables (vars)
  (dolist (v vars vars) (setf (get v 'variable-p) nil)))
(defun variable-p (x)
  (and (symbolp x) (get x 'variable-p)))
というように,シンボルのvariable-pという属性リストに T が入っていれば, マッチング変数とみなし,入っていなければ変数ではないというように 判定させるわけです.
<cl> (init-matching-variables '(a b c))
(A B C) 
<cl> (variable-p 'a)
T 
<cl> (match '((a) b x y c) '((d) e x y z))
((C . Z) (B . E) (A . D)) 
<cl> (clear-matching-variables '(a b c))
(A B C) 
<cl> (match '((a) b x y c) '((d) e x y z))
FAIL
という具合に,init-matching-variablesで変数を宣言し, clear-matching-variablesで変数でなくするように宣言します.
next up previous
Next: 1.4 バインディング情報の表現 Up: 1.3 変数の定義 Previous: 1.3.1 ?で始まる変数の判定
generated through LaTeX2HTML. M.Inaba 平成18年5月21日