Lambda function
Lambda 函数的起源
Alonso Church 阿隆佐·邱奇(1903年6月14日–1995年8月11日) 美国数学家,姓名更多写作 Alonzo Church
function without name, takes in a list of symbol
lambda 函数就是没有名字的函数(匿名函数),它的输入为符号列表,
> (lambda (x y) (+ x y))
; 这是一个输入为 x y 的函数,函数体为将两个输入相加
; #
定义 lambda 函数
; use define procedure
> (define s (lambda (x y) (+ x y)))
> (s 2 5)
; 7
; 定义一个 sum procedure
(define (sum x y) (+ x y))
; 使用lambda 方式定义
(define sum (lambda (x y) (+ x y)))
接下来看两个例子如何使用
(define (mcons a b)
(lambda (cmd)
(if (equal? cmd "car")
a
b)))
; 定义一个过程 mcons,输入为 a b,返回一个过程,但这个过程需要一个入参为 cmd , 当 cmd 为 "car" 时 返回 a, 否则返回 b
; 这里也使用了闭包 (closure)
(define (mcar pair) (pair "car"))
(define (mcdr pair) (pair "cdr"))
; 定义一个符号 foo
> (define foo (mcons 1 2))
> (mcar foo)
; 1
> (mcdr foo)
; 2
(define n0 (lambda () null))
; 定义 n0 为 lambda 的结果,此lambda 无入参(takes no argument) 返回过程 null
(define (minc x) (lambda () x))
; 定义 minc 过程,入参为x, 为lambda的结果,lambda 为一个无入参的过程 返回 x
(define (mdec x) (x))
; 定义 mdec 过程,调用 x
(define n1 (minc n0))
(define n2 (minc n1))
(define n3 (minc n2))
(define n4 (minc n3))
(define n5 (minc n4))
(define n0 (lambda () null))
(define (minc x) (lambda () x))
(define n1 (minc n0))
(define n2 (minc n1))
调用
> (n0)
; () ; 结果为 null 也就是空表
> (n1)
; #
; 调用 n1 返回过程 n0
> (n2)
; #
(define (mzero? x) (null? (x)))
; 定义 mzero? 过程,输入为x,如果 x 为 null 结果为 true,否则为 false (false otherwise)
(define (mequal? x y)
(cond
((mzero? x) (mzero? y))
; 如果 mzero? 对于 x 为真则返回 mzero? y
((mzero? y) (mzero? x))
; 如果 mzero? 对于 y 为真则返回 mzero? x
(else (mequal? (mdec x) (mdec y)))))
; 其他情况对x 使用 mdec ,对 y 使用 mdec,然后调用 mequal 计算两者的结果
对 n1 n0 调用 mequal?
> (mequal? n1 n0)
; #f
> (mequal? n1 n1)
; #t
> (mequal? n4 n5)
; #f
> (mequal? n4 n4)
; #t
(define (m+ x y)
(if (mzero? y)
x
(m+ (minc x) (mdec y))))
如果 y 使得 mzero? 成立,则返回 x
否则递归调用 m+ 计算 x 的增量 y 的减量 ,y 的减量是否使得 mzero? 为真。
> (mequal? (m+ n0 n2) n2)
; #t
> (mequal? (m+ n0 n2) n3)
; #f
> (mequal? (m+ n0 n2) (m+ n1 n2))
; #f
> (mequal? (m+ n2 n3) n5)
; #t
> (mequal? (m+ n5 n5) (m+ n4 (m+ n3 n3)))
; #t
关于本小节自定义了变量为 n0,为自定义的 0 值。
minc 为 increment 增量,也可以理解为 value++ 也就是 value = value + 1;
mdec 为 decrement 减量 ,也可以理解为 value-- 也就是 value = value - 1;
mzero 为 是否为自定义的 0 值 即 n0
mequal 为验证两个结果是否相等