`
daweibalong
  • 浏览: 44656 次
  • 性别: 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 中文翻译版.pdf

    common lisp的升级学习

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

    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运行再一个新版本会输出...

    ansi common lisp 教程

    新的和更强大的方法教育学生的思考程序,该文本包含一个教程的例子,说明Lisp编程的基本概念,以及ANSI Common Lisp的一个跟上时代的总结,列出每个运营商在语言。信息和乐趣,它给学生提供了他们所需要的一切,开始...

    实用Common.Lisp编程

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

    实用Common Lisp编程

    本书首先从作者的学习经过及语言历史出发,随后用21个章节讲述了各种基础知识,主要包括:REPL 及Common Lisp 的各种实现、S- 表达式、函数与变量、标准宏与自定义宏、数字与字符以及字符串、集合与向量、列表处理、...

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

    内含ANSI Common Lisp+On Lisp+实用Common Lisp编程,带书签

    一篇CommonLisp中文入门文章Common LISP Hints (CHM)

    一篇CommonLisp中文入门文章Common LISP Hints 从Ubuntu论坛上看到的, 觉着不错就给打包成了CHM 如果看不到请: 右键=>属性=>解除锁定

    LISP和通用LISP编程LISP and Common LISP Programming

    这是LISP和Common LISP编程的上一页,我们正在处理中,将那里的所有书籍都转换为新页面。 请再次检查此页面!!!

    Common.Lisp编程 中文版本

    本书首先从作者的学习经过及语言历史出发,随后用21个章节讲述了各种基础知识,主要包括:REPL 及Common Lisp 的各种实现、S- 表达式、函数与变量、标准宏与自定义宏、数字与字符以及字符串、集合与向量、列表处理、...

    成功的Lisp:如何理解和使用Common LispSuccessful Lisp: How to Understand and Use Common Lisp

    本书是为专业程序员而写的。 它采用动手方法引入了ANSI Common Lisp标准。

    ANSI Common Lisp 中文版

    学习common lisp的入门书,推荐!!

    实用Common Lisp编程 高清官方中文版

    本书首先从作者的学习经过及语言历史出发,随后用 21 个章节讲述了各种基础知识,主要包括 :REPL 及 Common Lisp 的各种实现、S- 表达式、函数与变量、标 准宏与自定义宏、数字与字符以及字符串、集合与向量、列表...

    Common Lisp The Language 2nd

    Common Lisp 指南第二版 为数不多的入门资料。

    common lisp

    Common Lisp,一般缩写为 CL(不要和缩写同为CL的組合邏輯混淆),是Lisp的方言,标准由ANSI X3.226-1994定义。它是为了标准化此前众多的Lisp分支而开发的,它本身并不是一个具体的实现而是各个Lisp实现所遵循的规范...

    CommonLisp数据库

    CommonLisp 的简单而复杂的MP3 数据库,根据实用CommonLisp编程

    Common Lisp语言,第二版Common Lisp the Language, 2nd Edition

    Lisp程序员的圣经。 每个官方规范,Common Lisp中定义的每个功能都可以在此处找到。

Global site tag (gtag.js) - Google Analytics