【SICP读书笔记(一)】正则序展开的特殊情况
scheme解释器有两种实现方式,一种是应用序,先对每个参数求值,再以首过程对所有求得的参数求值。
第二种是正则序,会“完全展开然后归约”(书中原文)
SICP中的练习1.5,让我困惑了一下。原题如下:
Ben Bitdiddle发明了一种检测方法,能够确定解释器究竟采用何种序求值,是采用应用序,还是采用正则序。他定义了下面两个过程:
(define (p) (p)) (define (test x y) (if (= x 0) 0 y))
而后他求值下面的表达式:
(test 0 (p))
问题:不同的求值序,结果会有不同吗?
我的想法:
应用序就不用说了,求解第二个参数的时候挂掉出不来。
问题是正则序,完全归约的话,也必须要去展开p啊?也一样没办法展开完啊?也会挂掉啊?
奇葩的是,正则序【不会】挂点,会输出0.
那是什么原因?
题目后面有个提示:
(无论采用正则序或者应用序,假定特殊形式的if的求值规则总是一样的。其中谓词部分先行求值,根据其结果确定随后求值的部分)
干,这意思就是,正则序第一次展开后,由于是if,所以就先就第一部分接着正则序展开了。
换言之,(正则(A,B))后,展开由于是(if A B),所以就先进行(if 正则(A) B),而不是先前想象的(if 正则(A) 正则(B))
而应用序由于首先必须对参数求值,没见到if的时候就死了
换言之,这是个死之前能不能见到if的问题
标签:
lisp
posted on 2014-12-06 14:26 shadowmydx'sLab 阅读(254) 评论(0) 编辑 收藏 举报
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】博客园携手 AI 驱动开发工具商 Chat2DB 推出联合终身会员
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何做好软件架构师
· 记录一次线上服务OOM排查
· Linux实时系统Xenomai宕机问题的深度定位过程
· 记一次 .NET某汗液测试机系统 崩溃分析
· 深度解析Mamba与状态空间模型:一图带你轻松入门
· 如何做好软件架构师
· 记录一次线上服务OOM排查
· SQL优化的这15招,真香!
· [.NET] 单位转换实践:深入解析 Units.NET
· 将 EasySQLite 从 .NET 8 升级到 .NET 9