最近,开始学习Scheme(我注意了一周),所以一切都让我感到困惑和困惑。现在意识到表达"评价"是该计划的主要焦点..与其他"程序语言"语言,Scheme是一个不同的世界(是的,"功能语言")。
开始了解新语言,"回到基础知识"。 我已经阅读了一些other questions和答案,但这并不是我想知道的或者我在困惑的东西(现在......也许以后,可能会更好......)
问题1。 究竟是什么"评估"是指在Scheme?和Scheme中使用"评估环境" =堆叠?分配内存???与执行有何不同?
问题2。 环境与"协议,参数"类似的定义在一个功能?
问题3。 "初始值"在Scheme 和"初始值"其他程序编程(c / c ++)是一样的意思吗?程序语言中的初始值通常是在程序运行之前必须分配的值...通常为0,null,...内存的起始地址......等等......但我对Scheme' s&的印象#34;初始值"有点不同。方案"初始值" =函数本身(至少在递归中)...任何人都可以用非常简单的表达方式解释清楚(没有"嗡嗡声方案"单词)???
问题4。那么似乎你可以解释let,letrec,let *与评价之间的区别。 (还不确定)。 这样的事情(可能是完全错误的......),
4-1)["当正常"让"评估 ,在绑定完成之前评估初始值表达式。"]表示? =(用我的话)让执行?并且我不明白..这个"在完成绑定之前评估初始值表达式。" 如何在绑定完成之前评估... ??究竟是什么意思"绑定完成" ???
4-2)["让*":当订单很重要时,逐步评估环境(参数?)以及订单程序行(? ??)]通过这个解释,对我来说,evaluateates = execution .... => (我的解释,"让*"分配内存并逐步执行每个参数以及程序行的顺序???
4-3)&#34; letrec&#34; :[&#34; letrec让我们在评估初始值(??)表达式之前创建一个环境,以便初始值计算在新环境中执行(< em>我的解释这听起来是尾递归)]。&#34; =&GT;在评估初始值之前创建一个环境,如何?
问题5。 Scheme中没有初始化,声明......
很抱歉这个问题很长,对其他人来说可能太基本了。但它会帮助我清除Scheme中的内容。
答案 0 :(得分:1)
评估是运行一些代码到它的结果的过程。例如。 (+ 1 2) ;==> 3
。在此特定示例中,+
是需要在环境中的自由变量。它可以评估全局程序+
,也可能是它之前运行的代码运行的词法变量。
环境是在某一点可访问的变量。例如
(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) ; ==> 8
f2
x
的范围已不复存在,但它在procedure
中被引用,并且可以在运行时访问,但不能从其他任何地方访问。评估的lambda
形式(即一个过程)也称为闭包,因为在应用该lambda形式的结果(过程)时,可以访问在评估点可访问的变量。
启动Scheme程序时,您有一个初始的全局环境。定义了+
和cons
等变量。我不确定这是你追求的。也许你应该举例说明你在想什么?
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)
无效。您的Scheme实现可能使用任何值代替undef
。什么时候用?使用``letrec and named
让for procedures that you need to recurse, use
让* for variables where you rely on a previous calculation (it keeps you from writing nested
尽可能让forms and use
让`。
因此,假设你有一个不递归的过程,你得到的变量和变量可以使用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))
有。如果我想创建全局变量,我会这样做:
(define test 55)
(define fun (lambda (x) (+ test x))