• 状况系统是这样的:底层代码产生状况---》中层代码制定多种恢复策略-》上层代码处理并选择中层的恢复策略
• 将从错误中恢复的代码与决定选择如何恢复进行分离,也就是说,错误恢复方法在底层提供了,选择哪个进行恢复的选择权交给高层函数。
• 状况系统使得我们在写底层功能函数时只关注函数功能即要完成的事情,而对于错误的恢复方法都在中下层提供,高层拥有最后的选择权。另外,状况系统使得我们在遇到错误的时候不必转到调试器而停止,而是进入预想的错误处理的方法中。
• 以下是处理函数对抛出的error的简单的处理方式:
(define-condition malformed-log-entry-error (error)
((test :initarg :text :reader text)))
(defun parse-log-entry (text)
(if (evenp text)
text
(error 'malformed-log-entry-error :text text)))
(defun parse-log-file ()
(loop for i from 1 to 10 do
(handler-case (parse-log-entry i)
(malformed-log-entry-error(var) (text var))))
结果为:
((1 "odd") (2 "even") (3 "odd") (4 "even") (5 "odd") (6 "even") (7 "odd") (8 "even") (9 "odd") (10 "even"))
• restart-case可以有多个,每次抛出error,调用栈都会跳出多个restart让你选择,处理的方法是调用invoke-restart来主动选择重启策略,这个选择我们在高层函数中利用handler-bind对错误类型和处理函数进行绑定,这就使得我们可以在中层和底层代码中制定多种重启策略,在不同的高层函数中选择不同的处理策略,以下是我改写的书上例子,目的是要理解多个restart-case的运行方式:
(define-condition malformed-log-entry-error (error)
((test :initarg :text :reader text)))
(defun parse-log-entry (text)
(if (evenp text)
(list text "even")
(error 'malformed-log-entry-error :text text)))
(defun parse-log-file ()
(loop for i from 1 to 10
for entry = (restart-case (parse-log-entry i);;提供三个restart-case
(skip-log-entry () "a")
(use-value (v) (list v "odd"))
(reparse-entry (fixed-text) (parse-log-entry fixed-text)))
when entry collect it))
(defun analyze-log ()
(print (parse-log-file)))
(defun skip-log-entry (c)
(let ((restart (find-restart 'skip-log-entry)))
(when restart
(invoke-restart restart))))
(defun use-value-p (c)
(use-value (text c)))
(defun reparse-log-entry (c)
(let ((reparse (find-restart 'reparse-entry)))
(when reparse
(invoke-restart reparse (+ (text c) 11)))))
;;在高层函数中,根据不同的情况选择不同的再启动策略
(defun log-analyzer-skip ()
(handler-bind ((malformed-log-entry-error #'skip-log-entry))
(analyze-log)))
(defun log-analyzer-use ()
(handler-bind ((malformed-log-entry-error #'use-value-p))
(analyze-log)))
(defun log-analyzer-reparse ()
(handler-bind ((malformed-log-entry-error #'reparse-log-entry))
(analyze-log)))
• 分别运行log-analyzer-skip log-analyzer-reparse log-analyzer-use,结果为:
(("a" "odd") (2 "even") ("a" "odd") (4 "even") ("a" "odd") (6 "even") ("a" "odd") (8 "even") ("a" "odd") (2 "even") )
((12 "even") (2 "even") (14 "even") (4 "even") (16 "even") (6 "even") (18 "even") (8 "even") (20 "even") (10 "even"))
((1 "odd") (2 "even") (3 "odd") (4 "even") (5 "odd") (6 "even") (7 "odd") (8 "even") (9 "odd") (10 "even"))
可见,对于同一种condition,我们在不同的高层函数中选择不同的策略进行处理,得到了不同的结果。
分享到:
相关推荐
该资源为学习和使用 ANSI Common Lisp 语言提供了一个完善的指南,涵盖了从基础知识到高级主题的方方面面,对于 Lisp 编程语言的学习和应用具有重要的参考价值。 知识点: 1. ANSI Common Lisp 是一种功能强大且...
Common Lisp中的Common Lisp Object System (CLOS)提供了多重继承和多态性的支持,使得面向对象编程在Common Lisp中成为可能。 #### 5. 跨平台性 Common Lisp编写的程序可以在多种操作系统上运行,包括Windows、...
8. **面向对象编程**:虽然不是其核心特性,但Common Lisp提供CLOS(Common Lisp Object System),一个完全集成的、可扩展的面向对象系统。 9. **元编程**:由于其强大的宏系统和反射能力,Common Lisp支持元编程...
在面向对象编程方面,Common Lisp提供了一个灵活的对象系统,称为CLOS(Common Lisp Object System)。CLOS支持多重继承、方法组合、通用函数和类的动态修改,这使得设计复杂对象模型变得可能。 书中的HTML标签表明...
本书的中文翻译版本不仅包含了原书的所有内容,还针对中文读者进行了细致的编排和调整,使得读者能够更好地理解和掌握Common Lisp的精髓。 #### 二、章节概览 1. **简介(Introduction)**:本章主要介绍了Common ...
4. 面向对象编程(CLOS):Common Lisp支持多种编程范式,其中面向对象编程是通过Common Lisp对象系统(Common Lisp Object System,简称CLOS)实现的。CLOS不仅支持类和继承,还支持多重方法分派、组合设计模式等...
本压缩包包含三本关于Common Lisp的重要书籍,分别是《ANSI Common Lisp》、《On Lisp》以及《实用Common Lisp编程》,都是学习和深入理解Common Lisp的宝贵资源。 《ANSI Common Lisp》由Paul Graham撰写,是...
这本书以其精细的页面设计和清晰的印刷质量,非常适合打印阅读,以便于深度学习和理解Lisp的强大之处。 Lisp是一种历史悠久且功能强大的编程语言,它的语法结构独特,以括号表示代码结构,这在其他编程语言中并不多...
《On Lisp》不是一本 Lisp 的入门教材,它更适合读过《ANSI Common Lisp》或者《Practical Common Lisp》 的 Lisp 学习者。它对 Lisp 宏本身及其使用做了非常全面的说明,同时自底向上的编程思想贯穿全书,这也是...
8. **面向对象编程**:Common Lisp的CLOS(Common Lisp Object System)是完全集成的、可扩展的面向对象系统。书中将涵盖类的定义、方法的多重调度、通用函数、继承和消息传递等概念。 9. **模块化与命名空间**:...
书中详细讲解了Lisp的哲学思想、数据结构、控制流、函数式编程、宏系统、类型系统、面向对象编程等方面的内容,并提供了大量示例代码和实践项目,帮助读者深入理解并掌握Common Lisp的精髓。 ### 适用人群 - **...
通过《Common Lisp the Language, 2nd Edition》这本书,读者不仅可以深入理解Common Lisp的语言特性,还能学习如何利用这些特性构建复杂的应用程序。这本书对编程思想和技术有着深远的影响,是每个对LISP或高级编程...
- **阅读相关书籍**:除了《Common Lisp: A Gentle Introduction to Symbolic Computation》外,还可以参考其他经典的Lisp书籍,如《On Lisp》和《Practical Common Lisp》等。 总之,《Common Lisp: A Gentle ...
### Common Lisp:对符号计算的温和介绍 #### 一、引言 《Common Lisp:对符号计算的温和介绍...无论是在学术研究还是工业开发领域,Common Lisp都是一种强大而灵活的工具,值得每一位计算机科学爱好者去探索和学习。
在阅读本书的过程中,读者会随着章节的推进,像搭建阶梯一样逐渐建立起对Common Lisp的理解,这样的学习方法是本书的独特之处,也是它获得高度评价的原因之一。 综上所述,本书《Practical Common Lisp-1st-2005》...
This book: Provides an overview of Common Lisp for the ...Shows how to find what you need among the thousands of documented and undocumented functions and variables in a typical Common Lisp system.
- 讲述了为什么选择学习Common Lisp的理由,包括其在人工智能领域的应用、强大的功能性和灵活性等。 3. **第2章:欢迎来到Lisp (Welcome to Lisp)**: - 通过简单的例子来展示Lisp语言的基本语法和特点。 - 引导...
Common Lisp Koans 主要是帮助学习一些 lisp 规范特性和改进,可以学习到大量的 Common Lisp 语言特性。终端,在文件 'contemplate.lsp' 执行 lisp 解析器:sbcl --script contemplate.lsp运行再一个新版本会输出...
这本《Practical Common Lisp》之所以号称Practical,正是因为这本书大量介绍Common Lisp在现实世界中的各种应用方式,算是第一本「入世传教」的Common Lisp著作。《Practical Common Lisp》是目前最畅销的Common ...