这是《计算机程序的构造与解释》中的一道习题,如何去判断一个scheme解释器是采用什么方式进行求值的?应用序 or 正则序。应用序是先对参数求值而后应用,而正则序则相反——完全展开而后归约求值。正则序相比于应用序,会部分存在重复求值的情况。习题是这样的:
Ben Bitdiddle发明了一种检测方法,能够确定解释器究竟采用的哪种序求值,是采用正则序,还是采用应用序,他定义了下面两个过程:
<!---->(define (p) (p))
(define (test x y)
(if (= x 0)
0
y))
而后他求值下列的表达式:
<!---->(test 0 (p))
如果解释器采用的是应用序求值,ben将会看到什么情况?如果是正则序呢?
分别分析下这两种情况下解释器的求值过程:
1.如果解释器是
应用序,将先对过程test的参数求值,0仍然是0,(p)返回的仍然是(p),并且将无穷递归下去直到栈溢出,显然,在这种情况下,解释器将进入假死状态没有输出。
2.如果解释器是
正则序,完全展开test过程:
<!---->(define (test 0 (p))
(if (= 0 0)
0
(p))
接下来再进行求值,显然0=0,结果将返回0。
一般lisp的解释器都是采用应用序进行求值。这个问题在习题1.6中再次出现。我们知道scheme已经有一个cond else的特殊形式,为什么还需要一个if else的特殊形式呢?那么我们改写一个new-if看看:
<!---->(define (new-if predicate then-clause else-clause)
(cond (predicate then-clause)
(else else-clause)))
写几个过程测试一下:
<!---->(new-if (< 1 0) 1 0)
结果一切正常,但是,当这3个参数是过程的时候会发生什么情况呢?在这3个参数如果存在递归调用等情况下,解释器也将陷入无限循环导致栈溢出!比如书中的求平方根过程用new-if改写:
<!---->(define (new-if predicate then-clause else-clause)
(cond (predicate then-clause)
(else else-clause)))
(define (average x y)(/ (+ x y) 2))
(define (square x) (* x x))
(define (improve guess x)(average guess (/ x guess)))
(define (good_enough? guess x)
(< (abs (- (square guess) x)) 0.000001))
(define (sqrt_iter guess x)
(new-if (good_enough? guess x)
guess
(sqrt_iter (improve guess x) x)))
(define (simple_sqrt x)(sqrt_iter 1 x))
因为解释器是应用序求值,将对new-if过程的3个参数求值,其中第三个参数也是一个过程(sqrt_iter (improve guess x) x)) 递归调用自身,导致无限循环直到栈溢出。
分享到:
相关推荐
Java正则表达式是编程语言Java中用于处理字符串和文本的强大工具。它允许开发者通过模式匹配来执行复杂的文本分析和操作。在Java中,正则表达式的操作主要涉及两个核心类:`java.util.regex.Matcher`和`java.util....
"cad开发-在lisp中应用正则表达式" 本文介绍了在CAD二次开发软件LISP中应用正则表达式的方法,旨在解决LISP编程中文本编辑的难点。作者介绍了正则表达式的强大功能,并提供了两个函数:(xxexp)和(xxexpr),这些函数...
正则表达式在数据验证中的应用非常广泛,例如检查电子邮件地址的格式、验证电话号码、验证URL等。通过编写合适的正则表达式模式,可以高效地处理各种复杂的数据格式。熟练掌握正则表达式不仅可以提高编程效率,还能...
正则表达式,简称为正则,是一种强大的文本处理工具,广泛应用于数据验证、文本搜索、替换等场景。它通过一套特殊的语法来定义一个模式,这个模式可以匹配一系列符合特定规则的字符串。以下是对正则表达式应用的详细...
JavaScript应用实例-正则表达式学习.js
JavaScript应用实例-正则匹配手机号.js
### 正则表达式在数据库查询中的应用 #### 引言 在数据库管理与应用程序开发中,查询数据是一项常见的任务。传统的SQL查询虽然强大,但在处理复杂查询时可能存在一定的局限性,尤其是涉及到文本数据的模式匹配时。...
本篇文章将深入探讨易语言中的正则对象应用,包括正则对象的创建、正则匹配和正则替换等核心知识点。 首先,我们要理解什么是正则对象。在易语言中,正则对象是一个用于处理和分析字符串的特殊对象,它可以用来执行...
大学课程中编译原理课程的正则表达式章节中关于正则表达式的理解和应用,使用Java GUI进行编写,主要包括了各种主要的正则匹配和正则使用
正则表达式在文本处理领域有着广泛的应用,例如在网页爬虫、数据清洗、输入验证等方面都有其身影。 正则表达式,全称是Regular Expression,是一种模式匹配语言,通过特定的模式来匹配字符串,实现对文本的强大检索...
本文将深入介绍这两个语言中的正则表达式基础及其应用。 首先,让我们从JavaScript开始。在JavaScript中,正则表达式是通过构造函数`RegExp`来创建的,或者直接在字符串中使用斜杠`/`进行定义。例如,要创建一个...
让 Office Excel、WPS 表格支持正则表达式的免费插件:「Excel 正则工具」顾名思义,需要使用 “正则表达式(PCRE)” 的知识来进行操作,对于完全没有接触过正则的朋友也许有一定的入门门槛,但正则实在是太过强大...
像正则表达式的一些应用,如用来判断处理字符串,像身份证号码,邮箱号等等约束,里面有详细的说明和使用实例,很适合初步接触正则表达式的人来学习
JAVA正则表达式应用:任意输入一串字符串 如何输入exit退出程序;从输入的字符串中判断是否包含手机号码 正则表达式可以使用" +86| 86 1 d{10}" 如果包含请将其在控制台打印出来 否则输出不包含字符串 ...
在实际应用中,我们需要根据不同的需求,组合不同的正则表达式语法和规章来实现特定的匹配模式。 9. 实例分析 例如,我们可以使用正则表达式来匹配手机号码:^1[3-9]\d{9}$。这个正则表达式将匹配以 1 开头、后面...
4. **正则表达式在编程中的应用** - 数据验证:在表单提交时,可以使用正则表达式验证输入格式,如邮箱、电话号码等。 - 文件搜索:在代码编辑器中,使用正则表达式快速查找和替换特定模式的文本。 - 数据清洗:...