我一直在阅读Peter Seibel Practical Common Lisp的优秀书籍,以便解决我一直在做的与Common Lisp错误处理系统相关的研究。
虽然我已经阅读了本书中的解释并尝试在网上挖掘一些信息,但我无法理解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))))
答案 0 :(得分:7)
以下是Lispworks中的示例。
让我们定义一个带有foo
插槽的课程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是use-value重启,数字3是store-value重启。
让我们获取重启列表:
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>
答案 1 :(得分:0)
也许是一个非常简单的解释:use-value
将仅使用一次给出的值,下次当你到达同一个地方时,它会再次出错。 store-value
只会要求您进行一次更正。
想象一下这种情况:你正在迭代一个数组,在某些地方你错误地输入了索引变量,比如j
而不是i
。如果您在点击不存在的变量时选择use-value
,它将一直询问您,直到循环结束。但是如果你选择store-value
,那么它将尝试使用你给它的任何东西,如果它有效,它将继续静默直到循环结束。