3

我一直在阅读 Peter Seibel Practical Common Lisp的优秀书籍,以解决我一直在做的与 Common Lisp 错误处理系统相关的一些研究。

虽然看了书上的解释,也试着在网上挖了一些资料,但一直无法理解andrestarts的含义和STORE-VALUE用法USE-VALUE。有人可以解释这些功能的目的是什么吗?

;;; Example of the STORE-VALUE and USE-VALUE restarts

(defun careful-symbol-value (symbol)
   (check-type symbol symbol)
   (restart-case (if (boundp symbol)
                     (return-from careful-symbol-value 
                                 (symbol-value symbol))
                     (error 'unbound-variable
                            :name symbol))
     (use-value (value)
       :report "Specify a value to use this time."
     value)
     (store-value (value)
       :report "Specify a value to store and use in the future."
       (setf (symbol-value symbol) value))))
4

2 回答 2

7

这是Lispworks中的一个示例。

让我们定义一个foo带有 slot的类bar

CL-USER 26 > (defclass foo () (bar))
#<STANDARD-CLASS FOO 4020001723>

我们需要一个实例:

CL-USER 27 > (make-instance 'foo)
#<FOO 402000339B>

现在我们尝试访问该对象的未绑定插槽。请注意,*访问先前评估的结果。

CL-USER 28 > (slot-value * 'bar)

我们收到一个错误和一堆重启:

Error: The slot BAR is unbound in the object #<FOO 402000339B>
    (an instance of class #<STANDARD-CLASS FOO 4020001723>).
  1 (continue) Try reading slot BAR again.
  2 Specify a value to use this time for slot BAR.
  3 Specify a value to set slot BAR to.
  4 (abort) Return to level 0.
  5 Return to top loop level 0.

Type :b for backtrace or :c <option number> to proceed.
Type :bug-form "<subject>" for a bug report template or :? for other options.

第 2 次是使用价值重启,第 3 次是存储价值重启。

让我们获取重启列表:

CL-USER 29 : 1 > (compute-restarts)
(#<RESTART ABORT 4020009EB3>       #<RESTART ABORT 4020009F53>
 #<RESTART NIL 402000585B>         #<RESTART USE-VALUE 40200058DB>
 #<RESTART STORE-VALUE 402000595B> #<RESTART ABORT 40200059DB>
 #<RESTART ABORT 4020005A7B>       #<RESTART ABORT 41700D2503>)

在 LispWorks 中,我们可以使用:cc.

CL-USER 30 : 1 > :cc
#<UNBOUND-SLOT 40200056F3>

找到重启:

CL-USER 31 : 1 > (find-restart 'store-value *)
#<RESTART STORE-VALUE 402000595B>

让我们打印它:

CL-USER 32 : 1 > (princ *)
Specify a value to set slot BAR to.
#<RESTART STORE-VALUE 402000595B>

也用于use-value重新启动:

CL-USER 33 : 1 > :cc
#<UNBOUND-SLOT 402000B293>

CL-USER 34 : 1 > (find-restart 'use-value *)
#<RESTART USE-VALUE 402000B47B>

CL-USER 35 : 1 > (princ *)
Specify a value to use this time for slot BAR.
#<RESTART USE-VALUE 402000B47B>
于 2013-05-26T21:57:46.367 回答
0

也许是一个非常简单的解释:use-value只会使用一次你给它的值,下次你打到同一个地方,它会再次出错。store-value只会要求您更正一次。

想象一下这种情况:您正在迭代一个数组,并且在某些地方您输入了错误的索引变量,例如,j而不是i. 如果您选择在use-value点击不存在的变量后,它会一直询问您,直到循环结束。但是如果你选择store-value,那么它会尝试使用你给它的任何东西,如果它有效,它将默默地继续直到循环结束。

于 2013-05-26T21:40:17.963 回答