当前位置: 首页 > news >正文

创建网站商城企业网站建设方案范文

创建网站商城,企业网站建设方案范文,品牌网站设计有哪些建议,网址导航网站如何做说明,这是r5rs的用法. (letrec ((<variable> <init>) ...) <body>) 假设((<variable> <init>) ...)是变量定义块V,<body>是执行块B. letrec最常见的用法就是用于绑定函数对象,让V里面定义的所有变量可以在运行时相互引用,不受位置前后的…

说明,这是r5rs的用法. 

(letrec ((<variable> <init>) ...) <body>) 

假设((<variable> <init>) ...)是变量定义块V,<body>是执行块B.

 

letrec最常见的用法就是用于绑定函数对象,让V里面定义的所有变量可以在运行时相互引用,不受位置前后的限制.比如:

> (letrec ((x (lambda () (+ y y)))(y 100))(+ (x) y))
300

这说明运行(+ (x) y)时,函数对象x可以读取y对象的值,尽管y在x之后才绑定的. 这一点letrec很像顶层的运作模式:

> (define x (lambda () (+ y y)))
> (define y 100)
> (+ (x) y)
300

只不过letrec创建的是一个本地作用域,而且语法上更简单.

 

将letrec替换为let*或let将出错:

> (let* ((x (lambda () (+ y y)))(y 100))(+ (x) y))
. . y: undefined;cannot reference an identifier before its definition
> (let ((x (lambda () (+ y y)))(y 100))(+ (x) y))
. . y: undefined;cannot reference an identifier before its definition
> 

 

let*最多只能让靠后的variable引用靠前的variable.交换一下x,y的定义位置,就正常了:

> (let* ((y 100)(x (lambda () (+ y y))))(+ (x) y))
300

而let限制更严格,各variable只能在body中被引用:

> (let ((y 100)(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 1)))))(iodd?(lambda (n)(if (zero? n)#f(ieven? (- n 1))))))(ieven? 3))  
#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 2)(b a)) b)
#<undefined>

对比顶层运作,不存在这种限制:

> (define a 2)
> (define b a)
> b
2

那为什么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 2)(b a)) b)
2

 

转载于:https://www.cnblogs.com/xiangnan/p/3387146.html

http://www.lbrq.cn/news/2636209.html

相关文章:

  • 牛b插网站建设百度seo公司一路火
  • 网站栏目名seo免费课程
  • 网站设计一个月多少钱做网站建网站公司
  • 做b2b网站有没有用怎么自己做网页
  • 广州手机建设网站网络公司经营范围
  • 定兴网站建设2023年7月最新疫情
  • 检索网站怎么做小程序平台
  • 来宾市住房和城乡建设局网站北京seo方法
  • 企业免费建站是真的吗申请自己的网站
  • 长沙做个网站多少钱网络推广专家
  • 前端官网模板南宁关键词优化软件
  • 网站建设提升医院信息化水平关键词优化排名网站
  • 阿里妈妈用哪个软件做网站体验营销是什么
  • 资料查询网站建设注册安全工程师
  • win7在iis中新建一个网站优秀企业网站模板
  • 算命网站做竞价赚钱企业网络营销策划方案
  • 怎样做自己公司的网站领硕网站seo优化
  • 烟台福山建设工程监测网站百度搜索网页版
  • python wordpress api第三方关键词优化排名
  • 青岛外贸建设网站制作常用的网络推广方法
  • 在手机上怎么赚钱博客seo怎么做
  • 如何对网站做压力测试抖音关键词搜索排名收费
  • 做网站都需要准备什么网络推广培训课程内容
  • 如何制作课程网站模板下载微信运营
  • 做动画网站郑州seo优化顾问热狗
  • 网络建设可行性分析怀化网站seo
  • 社交网站设计附近成人电脑培训班
  • 扬州网站建设制作有了域名怎么建网站
  • 武汉微信网站建设站长之家网站流量查询
  • 佛山顺德容桂网站制作关键词网站排名查询
  • Day01 项目概述,环境搭建
  • 深入解析K-means聚类:从原理到调优实战
  • C++的入门学习
  • 【算法训练营Day22】回溯算法part4
  • 解锁高效开发:AWS 前端 Web 与移动应用解决方案详解
  • 【Excel】通过Index函数向下拖动单元格并【重复引用/循环引用】数据源