lambda过程作为返回值的例子-分析,及一个作用域的例子

lambda过程作为返回值的例子-分析,及一个作用域的例子


1. 昨天的例子的分析


昨天整完lambda过程作为返回值的例子就被二猫叫走了,没来得及分析.


以下是分析及另一个的例子(似乎出自SICP,记不大清了).


以下混用过程和函数.


: guile> (define (foo x)
:     (cond   ((= x 1) (lambda (y) (+ y 10)))
:         ((= x 2) (lambda (y) (+ y 20)))
:         (else    (lambda (y) (+ y 0)))))


这段代码可以理解为


(define (foo x) (啥啥东西))


这意味着,定义了一个过程名为foo,有一个参数.


我们再看 (啥啥东西) 的里面


: (cond   ((= x 1) (lambda (y) (+ y 10)))
:         ((= x 2) (lambda (y) (+ y 20)))
:         (else    (lambda (y) (+ y 0))))


一个条件判断,有三种可能,每种可能都形如


: ((= x 1) (lambda (y) (+ y 10)))


其中 (= x 1) 是 判断条件部分,后面的 (lambda (y) (+ y 10)) 是整个表达式
的值,即foo这个过程的返回值.


这个返回值是什么呢?


: (lambda (y) (+ y 10))


这个返回值是一个函数,匿名,有一个参数,函数体是 (+ y 10),即把这个参数
加10以后返回.


整理一下. 
1.foo这个函数返回值是一个函数;
2.这个作为返回值的函数,函数体是 (+ y 10).


我们再测试一下.


: guile> (foo 1)
: #<procedure #f (y)>


意思是:foo这个函数传参数值为1,返回值是个函数,有一个参数.


: guile> ((foo 1) 23)
: 33


当foo的参数为1的时候,cond求值为
: ((= x 1) (lambda (y) (+ y 10)))


(lambda (y) (+ y 10)) 的参数是
: guile> ((foo 1) 23)
中的23.


即,把(foo 1)代换为(lambda (y) (+ y 10)),这正是对(foo 1)求值的结果.


那么 ((foo 1) 23) 就成了 ((lambda (y) (+ y 10)) 23).


在一个参数的函数上,传参(apply)值为23,所以值为(+ 23 10),即33.


以下例子请作为练习分析.


: guile> ((foo 2) 23)
: 43
: guile> ((foo 3) 23)
: 23
: guile> ((foo 2) 33)
: 53


2. 新的例子.


2.1 


: guile>(define (f x y)
: ((lambda (a b)
: (+ (* x (* a a)) (* y b) (* a b)))
: (+ 1 (* x y))
: (- 1 y)))


即 (define (f x y) (啥啥东西) )


定义函数f,有两个参数.


啥啥东西是:


: ((lambda (a b)
: (+ (* x (* a a)) (* y b) (* a b)))
: (+ 1 (* x y))
: (- 1 y))


这是什么呢?


这是 ((lambda (a b) (又一个啥啥东西))
(东西1)
(东西2))


这是什么意思呢?


这是 (一个匿名函数 (参数1) (参数2)).


其中 参数1 = 东西1; 参数2 = 东西2.


请先回顾一下,然后我们继续.


所以这是什么呢?这是给有两个参数的一个匿名函数传参,求值.


这个匿名函数是什么呢?(lambda (a b) (又一个啥啥东西)


原文是 (+ (* x (* a a)) (* y b) (* a b)).


2.2


所以,我们退回去一些,下式得到了解释.


: ((lambda (a b)
: (+ (* x (* a a)) (* y b) (* a b)))
: (+ 1 (* x y))
: (- 1 y))


它的意思是"这是给有两个参数的一个匿名函数传参,求值."


再往回退一点,第2节提到的式子,如下,得到了解释.


: (define (f x y)
: ((lambda (a b)
: (+ (* x (* a a)) (* y b) (* a b)))
: (+ 1 (* x y))
: (- 1 y)))


我们定义了一个函数名为f,两个参数,这个函数f的作用是 给两个参数的一个匿名函数传参求值.


我们测试一下.


: guile>(f 1 2)
: 4


2.3


这个例子的求值,一个关键因素是那些 x、y、a、b 的值,或者说,它们的作用域。


在没有被覆盖的情况下,lambda里面的x、y就是f里面的x、y。请看下面的等价测
试。


: guile> (define x 1) (define y 2) (define a 3) (define b -1)

: guile> (+ (* x (* a a)) (* y b) (* a b))
: 4

你可能感兴趣的:(lambda过程作为返回值的例子-分析,及一个作用域的例子)