评估与执行(计划)

时间:2014-05-14 09:24:27

标签: scheme

最近,开始学习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中的内容。

1 个答案:

答案 0 :(得分:1)

1评估

评估是运行一些代码到它的结果的过程。例如。 (+ 1 2) ;==> 3。在此特定示例中,+是需要在环境中的自由变量。它可以评估全局程序+,也可能是它之前运行的代码运行的词法变量。

2环境

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

(define x 10)
(define f1 (lambda (y) (+ x y))
(define f2 (let ((x 5))
              (lamdba (y) (+ x y))))

f1f2开始的lambda形式是相同的,因为它们完全相同。环境的差异。

(f1 3) ; ==> 13
(f2 3) ; ==> 8

f2 x的范围已不复存在,但它在procedure中被引用,并且可以在运行时访问,但不能从其他任何地方访问。评估的lambda形式(即一个过程)也称为闭包,因为在应用该lambda形式的结果(过程)时,可以访问在评估点可访问的变量。

3初始值

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

4 letlet*letreclambda

在所有例子中都有这些:

(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 namedfor 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))

5个声明

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

(define test 55)
(define fun (lambda (x) (+ test x))