gpt4 book ai didi

lisp - Common Lisp 中的函数名和动态绑定(bind)

转载 作者:太空宇宙 更新时间:2023-11-03 18:44:26 25 4
gpt4 key购买 nike

我正在阅读 Peter Norvig 的 AI 范式。在第 6.2 章中,作者使用了如下代码(不是原始代码,我挑出了麻烦的部分):

代码片段:

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

按照作者的原意,这段代码应该返回2,但是在sbcl 1.1.1中,解释器显然没有查找op 在环境中,抛出 op: undefined function

这个实现是特定的吗?由于代码必须已经在其他一些 lisp 上进行了测试。

附注Original code

最佳答案

你可能是说

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

编辑(2013-08-21):

PAIP 是在 ANSI-Common-Lisp 之前的时代编写的,因此代码可能有一些不符合标准的地方。我们可以做这些示例适用于以下修订:

(defun match-if (pattern input bindings)
"Test an arbitrary expression involving variables.
The pattern looks like ((?if code) . rest)."
(and (eval (reduce (lambda (code binding)
(destructuring-bind (var . val) binding
(subst val var code)))
bindings :initial-value (second (first pattern))))
(pat-match (rest pattern) input bindings)))

;; CL-USER> (pat-match '(?x ?op ?y is ?z (?if (eql (?op ?x ?y) ?z))) '(3 + 4 is 7))
;; ((?Z . 7) (?Y . 4) (?OP . +) (?X . 3) (T . T))
;; CL-USER> (pat-match '(?x ?op ?y (?if (?op ?x ?y))) '(3 > 4))
;; NIL

关于lisp - Common Lisp 中的函数名和动态绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18331753/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com