これまでの他の答えは正しいです。評価される実際のフォームは、バインドされる変数ではありませんprogv
(単に(op arg)
) が、評価されるものについて言及しているものはありません。実際、(非常に) 短い説明を提供するためにリンクしたコード内のコメント (これは、そのファイル内で を使用する唯一のコードですprogv
):
(defun match-if (pattern input bindings)
"Test an arbitrary expression involving variables.
The pattern looks like ((?if code) . rest)."
;; *** fix, rjf 10/1/92 (used to eval binding values)
(and (progv (mapcar #'car bindings)
(mapcar #'cdr bindings)
(eval (second (first pattern))))
(pat-match (rest pattern) input bindings)))
アイデアは、への呼び出しが次のmatch-if
ように呼び出されるということです
(match-if '((?if code) . rest) input ((v1 val1) (v2 val2) ...))
の値である で呼び出さeval
れます。ただし、、、 &c. を対応する、 、 &c. にバインドする内で呼び出されるため、これらの変数のいずれかが でフリーに見える場合、が評価されるときにバインドされます。(second (first pattern))
code
eval
progv
v1
v2
val1
val2
code
code