gpt4 book ai didi

exception - 常见的 lisp 异常处理(条件和重启)

转载 作者:行者123 更新时间:2023-12-04 17:08:14 25 4
gpt4 key购买 nike

我已经阅读了几天的 common lisp“Practical Common Lisp”异常处理章节,但我现在对示例和解释感到困惑,同时我尝试编写一些测试示例,但它没有像我一样工作预期,以下是我的测试样本。

  • 条件定义
    (define-condition evenp-error (error) 
    ((text :initarg :text :reader text)))
  • 定义打印奇数的函数
    (defun filter-evenp (lst)
    (dolist (x lst)
    (if (not (evenp x))
    (print x)
    (error 'evenp-error :text x))))
  • 重启功能
    (defun skip-evenp (c) (invoke-start 'skip-evenp))
  • 重启案例
    (restart-case (filter-evenp (list 1 2 3 4 5))
    (skip-evenp () nil))

  • 我想要做的就是打印所有奇数并跳过偶数错误,我的样本有什么问题?有人帮忙吗?提前谢谢了!!

    最佳答案

    Practical Common Lisp非常详细,但确实条件系统可能需要一些时间来适应。您可能对 Kent Pitman 的文章感兴趣:Exceptional Situations in LispCondition Handling in the Lisp Language Family .

    这些在 What's a condition system and why do you want one? 中被引用.还有很多其他的引用资料,比如这个 Wikibooks entry或 C2 维基的 CommonLispConditionSystem入口。

    定义重启

    一个 RESTART-CASE 基本上说:

    I am going to execute this form and I don't care if it signals a condition or not. But if it does and you want to recover from that situation, here are different ways I can work around the problem (retry, ignore, etc.).



    您通常无法说明如何从调用点调用的代码中的错误中恢复。换句话说,它是 filter-evenp应该用 restart-case 包装代码以提供替代路径。对于您的示例,使用 CERROR 就足够了, 在建立 CONTINUE 时发出错误信号重新开始。
    (if (evenp x)
    (cerror "Ignore even number" 'evenp-error :text x)
    (print x))

    作为练习,您可以尝试替换 (cerror ...)带有明确的 restart-case构造。

    然后,如果你测试你的代码,你应该会看到你的调试器弹出并显示 CONTINUE重新开始。如果您定义了自己的重新启动,则可以对其进行不同的命名。

    调用重启

    在您的 skip-evenp函数,此时您正在调用未建立的重新启动,我认为您与 skip-evenp 混淆了命名重新启动和函数。

    您应该做的是通过调用重新启动来处理错误。

    在这里,您希望发出错误信号的代码继续运行,因此您真的不想展开执行堆栈。这就是为什么你必须使用 HANDLER-BIND .
    (handler-bind ((evenp-error (lambda (e) (invoke-restart 'continue))))
    (filter-evenp '(1 2 3 4)))
    1
    3

    您当然可以像您一样将匿名 lambda 提取到自定义函数中。

    关于exception - 常见的 lisp 异常处理(条件和重启),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36178141/

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