首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >评价与执行(计划)

评价与执行(计划)
EN

Stack Overflow用户
提问于 2014-05-14 09:24:27
回答 1查看 672关注 0票数 1

最近,开始学习计划(我已经关注了一个星期),所以所有的事情都让我感到困惑和困惑。现在认识到,“评价”是该方案的主要重点。与其他“程序语言”相比,Scheme是一个不同的世界(是的,“功能语言”)。

开始了解新的语言,“回到基础”。我读过一些other questions和答案,但这并不完全是我想知道的,也不是我所困惑的。也许以后,可能会更好

问题1. “评估”在方案中的确切含义是什么?和方案也使用“环境评估”=放入堆栈?分配内存?与执行有何不同?

问题2. 在函数中的定义是否类似于“一致性,参数”?

问题3.方案中的“初始值”和其他过程编程(c/c++)中的“初始值”的含义相同吗?通常过程语言中的初始值是程序运行前必须分配的值.通常是0,空,..。记忆的起始地址..。等等。不过,我对计划的“初始值”的印像是有点不同。方案“初始值”=函数本身(至少在递归中).有谁能用很简单的表达(没有“蜂鸣计划”)来解释清楚?

问题4.,那么您似乎可以用评估来解释let、letrec、let*之间的区别。(不是sure..yet)。像这样的事情(可能是完全错误的.)

4-1)“当正常的"let”被计算为时,初始值表达式在完成绑定之前进行计算。“意思是?=(用我的话)让什么时候被执行?我也不明白..。这个“初始值表达式是在完成绑定之前计算的。”如何在进行绑定之前进行评估.?“绑定完成”到底是什么意思?

4-2) "let*":当订单重要时,评估环境(参数?)一步一步地与订单程序行(?)根据这个解释,对我来说,评价=执行.=> (我的解释是,"let*“分配内存,并根据程序行的顺序逐步执行每个参数?)

4-3) "letrec“:"letrec允许在计算初始值(?)表达式之前创建一个环境,以便在新环境中执行初始值计算(我的解释是尾部递归)。”=>在计算初始值之前创建了一个环境,如何实现?

问题5.没有初始化,声明.在计划里?

很抱歉提出了一个很长的问题,这对其他人来说可能太基础了。不过,这会有助我在计划内澄清问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-14 12:46:57

1评价

求值是对其结果运行一些代码的过程。例如:(+ 1 2) ;==> 3。在这个特殊的例子中,+是需要在环境中的空闲变量。它可以计算为全局prcedure +,也可能是在此之前运行的代码中的词法变量。

2环境

环境是在某一点上可以访问的变量。例如:

代码语言:javascript
复制
(define x 10)
(define f1 (lambda (y) (+ x y))
(define f2 (let ((x 5))
              (lamdba (y) (+ x y))))

用于验证f1f2的lambda表单在意义上是相等的,它们做的事情完全相同。环境的不同。

代码语言:javascript
复制
(f1 3) ; ==> 13
(f2 3) ; ==> 8

f2x的作用域不再多,但它在procedure中是引用的,在运行它时是可访问的,而不是从任何其他地方。计算的lambda表单(即过程)也称为闭包,因为在应用该lambda表单(过程)的结果时,在计算点可以访问的变量是可访问的。

3初始值

启动Scheme程序时,您有一个初始的全局环境。定义了像+cons这样的变量。我不确定这就是你想要的。也许你应该举个例子来说明你在想什么?

4 letlet*letreclambda

在所有的例子中都有这样的例子:

代码语言:javascript
复制
(define x 10)
(define f (lambda (x) x)

每个人都会变成匿名的lambda函数调用。我只做一个级别,但由于您可以将let*转换为let,将let转换为lambda,所以您可以将所有这些转换为许多lambda表单。下面是操作步骤:

(let ((a 1) (b 2) ...) body ...)((lambda (a b ..) body ...) 1 2 ...)相同,因此这是正确的:

代码语言:javascript
复制
(let ((x 5) (y (+ x 1)) (f (lambda (x) (if (< 5 x) (f (- x 1)) x))))
  (list x y (f 10))) ; ==> (5 11 9)

(let ((a 1) (b 2)) body ...)(let ((a 1)) (let ((b 2)) body ...)相同,因此这是正确的:

代码语言:javascript
复制
(let* ((x 5) (y (+ x 1)) (f (lambda (x) (if (< 5 x) (f (- x 1)) x))))
  (list x y (f 10))) ; ==> (5 6 9)

(letrec ((a 1) (b 2)) body ...)(let ((a 'undef) (b 'undef)) (let ((tmpa 1) (tmpb 2)) (set! a tmpa) (set! b tmpb)) body ...)相同,因此这是正确的:

代码语言:javascript
复制
(letrec ((x 5) (y (list x 1)) (f (lambda (x) (if (< 5 x) (f (- x 1)) x))))
  (list x y (f 10))) ; ==> (5 (undef 1) 5)

注意,我将+更改为list,因为(+ 'undef 1)不能工作。您的方案实现可能使用任何值来代替undef。什么时候用什么?尽可能多地使用letrecand namedletfor procedures that you need to recurse, uselet*for variables where you rely on a previous calculation (it keeps you from writing nestedletforms and uselet`。

因此,假设您有一个不是递归的过程,一个变量和一个派生的变量可以使用let*

代码语言:javascript
复制
(let* ((sq (lambda (x) (* x x))) ; given this is a top level it will have global environment
       (x (sq 5))
       (y (sq 10))
       (res (+ x y)) ; here I'm using both x and y
  (do-something res))

5项声明

的确有。如果我想创建全局变量,我会这样做:

代码语言:javascript
复制
(define test 55)
(define fun (lambda (x) (+ test x))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23650566

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档