`
daweibalong
  • 浏览: 45321 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

Common Lisp状况系统(condition system)的学习和理解

阅读更多
• 状况系统是这样的:底层代码产生状况---》中层代码制定多种恢复策略-》上层代码处理并选择中层的恢复策略

• 将从错误中恢复的代码与决定选择如何恢复进行分离,也就是说,错误恢复方法在底层提供了,选择哪个进行恢复的选择权交给高层函数。

• 状况系统使得我们在写底层功能函数时只关注函数功能即要完成的事情,而对于错误的恢复方法都在中下层提供,高层拥有最后的选择权。另外,状况系统使得我们在遇到错误的时候不必转到调试器而停止,而是进入预想的错误处理的方法中。
   
• 以下是处理函数对抛出的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,我们在不同的高层函数中选择不同的策略进行处理,得到了不同的结果。
0
0
分享到:
评论
1 楼 muyinliu 2014-06-07  
第一个例子写错了。

相关推荐

    ANSI Common Lisp 中文翻译版.pdf

    该资源为学习和使用 ANSI Common Lisp 语言提供了一个完善的指南,涵盖了从基础知识到高级主题的方方面面,对于 Lisp 编程语言的学习和应用具有重要的参考价值。 知识点: 1. ANSI Common Lisp 是一种功能强大且...

    Practical Common Lisp笔记

    8. **面向对象编程**:虽然不是其核心特性,但Common Lisp提供CLOS(Common Lisp Object System),一个完全集成的、可扩展的面向对象系统。 9. **元编程**:由于其强大的宏系统和反射能力,Common Lisp支持元编程...

    Common Lisp The Language 2nd

    在面向对象编程方面,Common Lisp提供了一个灵活的对象系统,称为CLOS(Common Lisp Object System)。CLOS支持多重继承、方法组合、通用函数和类的动态修改,这使得设计复杂对象模型变得可能。 书中的HTML标签表明...

    实用Common.Lisp编程.pdf

    Common Lisp中的Common Lisp Object System (CLOS)提供了多重继承和多态性的支持,使得面向对象编程在Common Lisp中成为可能。 #### 5. 跨平台性 Common Lisp编写的程序可以在多种操作系统上运行,包括Windows、...

    实用Commonlisp编程

    4. 面向对象编程(CLOS):Common Lisp支持多种编程范式,其中面向对象编程是通过Common Lisp对象系统(Common Lisp Object System,简称CLOS)实现的。CLOS不仅支持类和继承,还支持多重方法分派、组合设计模式等...

    Common LISP书籍中文版pdf格式带书签.rar

    本压缩包包含三本关于Common Lisp的重要书籍,分别是《ANSI Common Lisp》、《On Lisp》以及《实用Common Lisp编程》,都是学习和深入理解Common Lisp的宝贵资源。 《ANSI Common Lisp》由Paul Graham撰写,是...

    Practical Common Lisp pdf

    这本书以其精细的页面设计和清晰的印刷质量,非常适合打印阅读,以便于深度学习和理解Lisp的强大之处。 Lisp是一种历史悠久且功能强大的编程语言,它的语法结构独特,以括号表示代码结构,这在其他编程语言中并不多...

    common lisp的升级学习

    《On Lisp》不是一本 Lisp 的入门教材,它更适合读过《ANSI Common Lisp》或者《Practical Common Lisp》 的 Lisp 学习者。它对 Lisp 宏本身及其使用做了非常全面的说明,同时自底向上的编程思想贯穿全书,这也是...

    Common Lisp 高级编程技术

    8. **面向对象编程**:Common Lisp的CLOS(Common Lisp Object System)是完全集成的、可扩展的面向对象系统。书中将涵盖类的定义、方法的多重调度、通用函数、继承和消息传递等概念。 9. **模块化与命名空间**:...

    ANSI Common Lisp(Pau Graham).pdf

    书中详细讲解了Lisp的哲学思想、数据结构、控制流、函数式编程、宏系统、类型系统、面向对象编程等方面的内容,并提供了大量示例代码和实践项目,帮助读者深入理解并掌握Common Lisp的精髓。 ### 适用人群 - **...

    ANSI Common Lisp 中文翻译版含目录

    本书的中文翻译版本不仅包含了原书的所有内容,还针对中文读者进行了细致的编排和调整,使得读者能够更好地理解和掌握Common Lisp的精髓。 #### 二、章节概览 1. **简介(Introduction)**:本章主要介绍了Common ...

    Common Lisp the Language, 2nd Edition CMU HTML 英文

    通过《Common Lisp the Language, 2nd Edition》这本书,读者不仅可以深入理解Common Lisp的语言特性,还能学习如何利用这些特性构建复杂的应用程序。这本书对编程思想和技术有着深远的影响,是每个对LISP或高级编程...

    lisp经典教程common lisp A Gentle Introduction To Symbolic Computation

    - **阅读相关书籍**:除了《Common Lisp: A Gentle Introduction to Symbolic Computation》外,还可以参考其他经典的Lisp书籍,如《On Lisp》和《Practical Common Lisp》等。 总之,《Common Lisp: A Gentle ...

    Common Lisp-对符号计算的温和介绍Common Lisp - A Gentle Introduction To Symbolic Computation

    ### Common Lisp:对符号计算的温和介绍 #### 一、引言 《Common Lisp:对符号计算的温和介绍...无论是在学术研究还是工业开发领域,Common Lisp都是一种强大而灵活的工具,值得每一位计算机科学爱好者去探索和学习。

    Practical Common Lisp-1st-2005

    在阅读本书的过程中,读者会随着章节的推进,像搭建阶梯一样逐渐建立起对Common Lisp的理解,这样的学习方法是本书的独特之处,也是它获得高度评价的原因之一。 综上所述,本书《Practical Common Lisp-1st-2005》...

    ansi common lisp documentansi common lisp document

    总之,《ANSI Common Lisp 文档》是学习和深入理解这一强大语言的宝贵资源,无论你是初学者还是经验丰富的开发者,都能从中获益匪浅。结合实际的编程练习和社区资源,如博客链接中的内容,你将能够更好地掌握 Common...

    Successful Lisp How to Understand and Use Common Lisp - David B. Lamkins

    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.

    CommonLisp语言学习程序CommonLispKoans.zip

    Common Lisp Koans 主要是帮助学习一些 lisp 规范特性和改进,可以学习到大量的 Common Lisp 语言特性。终端,在文件 'contemplate.lsp' 执行 lisp 解析器:sbcl --script contemplate.lsp运行再一个新版本会输出...

    实用Common.Lisp编程

    这本《Practical Common Lisp》之所以号称Practical,正是因为这本书大量介绍Common Lisp在现实世界中的各种应用方式,算是第一本「入世传教」的Common Lisp著作。《Practical Common Lisp》是目前最畅销的Common ...

Global site tag (gtag.js) - Google Analytics