2

Peter Norvig のParadigms of AI を読んでいます。章 6.2 で、著者は以下のようなコードを使用しています (元のコードではありません。問題のある部分を抜粋しました)。

コードスニペット:

(progv '(op arg) '(1+ 1)
(eval '(op arg)))

著者の本来の意図として、このコードは2を返すはずですが、sbcl 1.1.1では、インタプリタが明らかに環境内でopを検索しておらず、 を投げていop: undefined functionます。

この実装は固有のものですか? コードは他の Lisp でテストされている必要があるためです。

ps元のコード

4

4 に答える 4

2

これまでの他の答えは正しいです。評価される実際のフォームは、バインドされる変数ではありません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))codeevalprogvv1v2val1val2codecode

于 2013-08-20T13:26:04.727 に答える