最近,开始学习计划(我已经关注了一个星期),所以所有的事情都让我感到困惑和困惑。现在认识到,“评价”是该方案的主要重点。与其他“程序语言”相比,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.没有初始化,声明.在计划里?
很抱歉提出了一个很长的问题,这对其他人来说可能太基础了。不过,这会有助我在计划内澄清问题。
发布于 2014-05-14 12:46:57
1评价
求值是对其结果运行一些代码的过程。例如:(+ 1 2) ;==> 3。在这个特殊的例子中,+是需要在环境中的空闲变量。它可以计算为全局prcedure +,也可能是在此之前运行的代码中的词法变量。
2环境
环境是在某一点上可以访问的变量。例如:
(define x 10)
(define f1 (lambda (y) (+ x y))
(define f2 (let ((x 5))
(lamdba (y) (+ x y))))用于验证f1和f2的lambda表单在意义上是相等的,它们做的事情完全相同。环境的不同。
(f1 3) ; ==> 13
(f2 3) ; ==> 8f2的x的作用域不再多,但它在procedure中是引用的,在运行它时是可访问的,而不是从任何其他地方。计算的lambda表单(即过程)也称为闭包,因为在应用该lambda表单(过程)的结果时,在计算点可以访问的变量是可访问的。
3初始值
启动Scheme程序时,您有一个初始的全局环境。定义了像+和cons这样的变量。我不确定这就是你想要的。也许你应该举个例子来说明你在想什么?
4 let,let*,letrec和lambda
在所有的例子中都有这样的例子:
(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 ...)相同,因此这是正确的:
(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 ...)相同,因此这是正确的:
(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 ...)相同,因此这是正确的:
(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*。
(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项声明
的确有。如果我想创建全局变量,我会这样做:
(define test 55)
(define fun (lambda (x) (+ test x))https://stackoverflow.com/questions/23650566
复制相似问题