主要观点:Common Lisp 有类似其他语言的错误和条件处理机制,且能做更多。介绍了 Common Lisp 中与条件处理相关的各种机制,如 throwing/catching 与 signaling/handling 的区别、ignore-errors、handler-case 处理所有错误条件、处理特定条件、handler-case 与 handler-bind 的对比、定义和创建条件、signal 各种条件、查看栈跟踪、restarts 及在调试器中的交互选择、handler-bind 处理条件、unwind-protect 等。
关键信息:
- Common Lisp 中 throw 和 catch 是控制转移机制,与 C++、Java 不同,条件是被 signal 和处理的。
- ignore-errors 可忽略函数错误,handler-case 可处理一般 error 并返回自定义值。
- 可指定处理特定条件,handler-bind 可控制条件信号时的行为,包括使用 debugger 和 restarts。
- 用 define-condition 定义条件,make-condition 初始化,可通过 error、cerror、warn、signal 等信号条件。
- 可查看栈跟踪,restarts 是调试器中的选择,可通过 restart-case 定义和添加 restarts,还可通过 handler-bind 编程式调用 restarts。
- handler-bind 用于处理条件,unwind-protect 用于类似“finally”的操作。
重要细节: - Common Lisp 因开发的高度交互性,条件处理更适合自身,如在非交互式模式下也能工作。
- ignore-errors 运行代码时会给出警告并返回 nil 和信号条件。
- handler-case 的一般形式及各种条件类型的类优先级列表。
- 可通过 :report 函数自定义错误消息。
- 可使用 assert 的可选 restart 进行断言和修改值,通过 restart-case 定义更多自定义 restarts 及相关操作。
- 不同函数如 find-restart 用于查找 restart,restart 可隐藏等。
资源列举: - 《Practical Common Lisp》
- Common Lisp Recipes
- 语言参考
- 视频教程
- 相关论文
- z0ltan.wordpress.com 文章
- 其他相关教程和示例(如代数效应、csv 文件解析等)
- Python 中 CL 条件系统的实现和便携式 CL 条件系统的实现。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。