lambda函数的特性

通过对过程的逐步抽象,不难看出过程可以演化为某种模式,因此在新的章节。我们将在数据上做同样的抽象。
此处引入数对的概念来表达有理数,即通过基础过程cons,表达一个有序的数对:(define x (cons n d))
通过该数对,可以完成对数据的抽象。

点击查看代码
;分数的加法
(define (add-rat x y)
    (make-rat (+ ( * (number x) (denom y)) 
                 ( * (number y) (denom x)))
              (* (denom x)(denom y))

    )
)
;简化分数
(define (gcd a b)
    (if (= b 0)
        a
        (gcd b (remainder a b))
    ))
(define (number x)
    (let ((g (gcd (car x)(cdr x))))
        (/ (car x) g)))
(define (denom x)
    (let ((g (gcd (car x)(cdr x))))
        (/ (cdr x) g)))

序对的形式除了表达分数以外,还可以表达图形,例如通过坐标来表达线段两端的位置。

点击查看代码
;线段表达
(define (make-segment x1 y1 x2 y2)
    (start-segment x1 y1)
    (end-segment x2 y2)
)
;起点和终点的表达
(define (start-segment x y)
    (cons x y)
)
(define (end-segment x y)
    (cons x y)
)

在数据抽象的过程中,意外发现了lambda函数的一些特性,除了之前介绍的省略定义内容直接为某个变量构造函数的作用外,lambda还有以下特性:
1、lambda可以嵌套在其他lambda函数内部
根据练习2.4的要求,其定义了一个过程,

点击查看代码
(define (cons x y)
    (lambda (m) (m x y)))
(define (car z)
    (z (lambda(p q) p)))
要求验证对于任意的x、y,(car (cons x y))都将返回x 看到这个过程我觉得蛮不可思议的,但按照题目的要求进行代换看看: (car (cons x y)) ((lambda (m)(m x y))(lambda (p q) p )) ((lambda (p q) p) x y) ((lambda (x y) x) (x) 在这里,cons返回一个lambda函数,这个lambda函数接受一个参数,然后将参数作用于(x y)。car接受一个参数,并将其作用于另一个lambda过程。 但两者连接在一起,就变成car接受了cons的lambda函数并作用与另一个lambda函数。 就像((lambda (x) (+ x 4)) 5 )这一过程会返回9一样,对于cons来说,m就是(lambda(p q) q ) 很有意思,这让我对数据结构有了另类的认识,数据和过程并非泾渭分明,而是可以互相渗透的。
posted @ 2025-12-05 18:22  檐上落白luckin  阅读(0)  评论(0)    收藏  举报