Scheme r5rs letrec的用法
说明,这是r5rs的用法.
(letrec ((<variable> <init>) ...) <body>)
假设((<variable> <init>) ...)是变量定义块V,<body>是执行块B.
letrec最常见的用法就是用于绑定函数对象,让V里面定义的所有变量可以在运行时相互引用,不受位置前后的限制.比如:
> (letrec ((x (lambda () (+ y y)))
(y ))
(+ (x) y))
这说明运行(+ (x) y)时,函数对象x可以读取y对象的值,尽管y在x之后才绑定的. 这一点letrec很像顶层的运作模式:
> (define x (lambda () (+ y y)))
> (define y )
> (+ (x) y)
只不过letrec创建的是一个本地作用域,而且语法上更简单.
将letrec替换为let*或let将出错:
> (let* ((x (lambda () (+ y y)))
(y ))
(+ (x) y))
. . y: undefined;
cannot reference an identifier before its definition
> (let ((x (lambda () (+ y y)))
(y ))
(+ (x) y))
. . y: undefined;
cannot reference an identifier before its definition
>
let*最多只能让靠后的variable引用靠前的variable.交换一下x,y的定义位置,就正常了:
> (let* ((y )
(x (lambda () (+ y y))))
(+ (x) y))
而let限制更严格,各variable只能在body中被引用:
> (let ((y )
(x (lambda () (+ y y))))
(+ (x) y))
. . y: undefined;
cannot reference an identifier before its definition
当你表达式里含有一些相互递归的函数时,letrec非常合适.例如下面这个判断奇偶数的函数:
> (letrec ((ieven?
(lambda (n)
(if (zero? n)
#t
(iodd? (- n )))))
(iodd?
(lambda (n)
(if (zero? n)
#f
(ieven? (- n ))))))
(ieven? ))
#f
看起来letrec很强大的样子,那么,letrec的限制是什么呢?(准确说是r5rs的限制.Racket不存在这种限制)
letrec要求<init>必须能够独立成值,否则letrec绑定就会出问题.以下摘自r5rs:
One restriction on letrec is very important: it must be possible to evaluate each <init> without assigning or referring to the value of any <variable>.In the most common uses of letrec, all the <init>s are lambda expressions and the restriction is satisfied automatically.
比如下面这个,b绑定不了2:
> (letrec ((a )(b a)) b)
#<undefined>
对比顶层运作,不存在这种限制:
> (define a )
> (define b a)
> b
那为什么lambda表达式能够自动地满足这个要求呢?
因为一个lambda表达式是一个函数对象,它本身就是一个值.相当于100这种整数对象.
Scheme不会在定义时严格检查lambda.比如里面的某变量是否已绑定对象,lambda被执行时才知道会不会出问题.
> (lambda (n)(xxx? (- n 1)))
#<procedure>
> ((lambda (n)(xxx? (- n 1))) 3)
. . xxx?: undefined;
cannot reference undefined identifier
>
那let*存在的意义是什么? 看这种情况:
> (letrec ((a 2)(b a)) b)
#<undefined>
> (let* ((a 2)(b a)) b)
2
>
let*能让(b a)读取前面的定义(a 2),从而让b等于2.letrec就不行.
而let对比let*限制更多,因此性能应该是更好的.在let和let*都能正常运行的时候,显然应该选择let.
这应该就是let,let*和letrec各自存在的意义吧.
注:方言Racket的letrec没有此限制.
> (letrec ((a )(b a)) b)
Scheme r5rs letrec的用法的更多相关文章
- call/cc 总结 | Scheme
call/cc 总结 | Scheme 来源 https://www.sczyh30.com/posts/Functional-Programming/call-with-current-contin ...
- 算法语言Scheme修订6报告 R6RS简体中文翻译
算法语言Scheme修订6报告 R6RS简体中文翻译 来源 https://r6rs.mrliu.org/ MICHAEL SPERBERR. KENT DYBVIG, MATTHEW FLATT ...
- let区别(关于racket和r5rs)
R5RS is the Revised5 Report on the Algorithmic Language Scheme.参考http://www.schemers.org/Documents/S ...
- scheme 教程 #lang racket
scheme 教程 #lang racket 来源 https://blog.csdn.net/yemeishenme/article/details/51471037 原文: https://le ...
- 开始学习Scheme
开始学习Scheme 函数式编程(Functional Programming)是在MIT研究人工智能(Artificial Intelligence)时发明的,其编程语言为Lisp.确切地说,L ...
- Android基础学习第三篇—Intent的用法
写在前面的话: 1. 最近在自学Android,也是边看书边写一些Demo,由于知识点越来越多,脑子越来越记不清楚,所以打算写成读书笔记,供以后查看,也算是把自己学到所理解的东西写出来,献丑,如有不对 ...
- awk 的一些用法
awk,我觉得是Linux里面处理文本最精妙的命令,它是一个行处理的命令,它最初级的用法是:给定一些简单的pattern,然后按照这个pattern 去搜索匹配的行.它的高级用法是用awk来编程,除了 ...
- Android网页中tel,sms,mailTo,Intent,Market协议用法总结
tel:协议---拨打电话 <a href="tel:">调出拨号界面</a> <a href="tel:10086">调 ...
- 【Win10 UWP】URI Scheme(一):Windows Store协议的解析和使用
协议是Windows Phone和Windows Store应用的一个重要特点,可以做到在不同应用之间进行互相呼起调用.小小协议,学问大着呢.我打算写几篇关于协议在UWP中使用的文章. 这一讲的主要对 ...
随机推荐
- 目标检测算法YOLO算法介绍
YOLO算法(You Only Look Once) 比如你输入图像是100x100,然后在图像上放一个网络,为了方便讲述,此处使用3x3网格,实际实现时会用更精细的网格(如19x19).基本思想是, ...
- 最新IP数据库 存储优化 查询性能优化 每秒解析上千万
高性能IP数据库格式详解 每秒解析1000多万ip qqzeng-ip-ultimate.dat 3.0版 编码:UTF8 字节序:Little-Endian 返回规范字段(如:亚洲|中国| ...
- Flume报 Space for commit to queue couldn't be acquired. Sinks are likely not keeping up with sources, or the buffer size is too tight
报这个错误 需要一个是flume堆内存不够.还有一个就是把channel的容器调大 在channel加配置 type - 组件类型名称必须是memory capacity 100 存储在 Channe ...
- web攻击和防御措施
1.SQL注入:参照下面的链接 http://www.cnblogs.com/chenhaoyu/p/8758888.html 2.跨网站脚本攻击(Cross Site Scripting, XSS) ...
- 我的webstorm 使用总结
有一次 ,我改了公共组件里的好多组件 ,然后我肯定是哪里改的不对 ,出语法错误了 ,但是我的 webstorm 编译并没有报错,然后我就手动一点点 改 ,去看 ,最后还是没有找到 ,我就把文件夹给删了 ...
- [SDOI 2017]数字表格
Description 题库链接 记 \(f_i\) 为 \(fibonacci\) 数列的第 \(i\) 项. 求 \[\prod_{i=1}^n\prod_{j=1}^mf_{gcd(i,j)}\ ...
- [USACO 12DEC]Running Away From the Barn
Description It's milking time at Farmer John's farm, but the cows have all run away! Farmer John nee ...
- PKUWC 2018 滚粗记
day0 上午居然考了一场考试,大爆炸,攒了一波RP,下午也没有心思去落实题目,而是一心去搞颓废,到了晚上看时间还早,于是就看了一波上午考试的Solution,懵逼.jpg day1 上午考数学,前一 ...
- k-d tree模板练习
1. [BZOJ]1941: [Sdoi2010]Hide and Seek 题目大意:给出n个二维平面上的点,一个点的权值是它到其他点的最长距离减最短距离,距离为曼哈顿距离,求最小权值.(n< ...
- 关于Miller-Rabbin的一点想法
在好久之后终于搞完了miller-rabbin素性测试,谈谈自己的理解 要判断的数设为 a, 主要思想就是运用费马小定理来搞,随机几个数x(x<=a-1),判断x^(a-1)=1(mod a)是 ...