1

我想捕获unbound-variable异常并避免它们,即时创建一些变量而不会中断执行。我正在尝试在以下代码中使用handler-bindwith :invoke-restart

(defmacro my-progn (&rest rest)
  `(handler-bind
    ((unbound-variable
      (lambda (x)
        (progn
          ;(format t "UNBOUND VAR: ~a~%"
          ;  (symbol-name (cell-error-name x)))
          (invoke-restart 'just-continue)))))
    (progn ,@(mapcar (lambda (x)
                      `(restart-case ,x (just-continue () "XXXX"))) rest))))

(my-progn
  (print "AAA")
  (print xxxx) ;; xxxx is unbound
  (print "BBB"))

结果是:

"AAA"
"BBB" 

但我想继续执行 second print,只需将未绑定的变量 xxxx 替换为字符串“XXXX”:

"AAA"
"XXXX"
"BBB" 

当然,我可以用 包裹语法树中的任何符号handler-bind,但我担心这会产生巨大的开销。

有没有办法捕获unbound-variable异常并使用动态生成的值而不是丢失的变量继续执行代码?

4

1 回答 1

6

您可以使用适当的标准重新启动 use-value

(handler-bind
    ((unbound-variable
      (lambda (c)
        (declare (ignore c))
        (use-value "XXXX"))))
  (print "AAA")
  (print xxxx)
  (print "BBB"))
于 2020-05-16T13:13:53.103 回答