cons car cdr 的一个小实现

> (define (car x)
    (x 0))
> (define (cdr x)
    (x 1))
> (define (cons x y)
    (define (tem z)
      (cond ((= 0 z) x)
        ((= 1 z) y)))
    tem
     )
> (car (cons 1 2))
1
> (cdr (cons 1 2))
2

没有使用新的语法就实现了用cons car cdr 表示的序对。

(car (cons 1 2)) 返回 1

可以用其他方法实现

> (define (cons x y)
    (lambda (z) (z x y)))
    
> (define (car z)
    (z (lambda (p q) p)))
> (car (cons 1 2))
1

序对的一种应用

例:
用car cdr cons 表示2a + 3b
用非负数表示

> (define (cons a b)
    (lambda (z) (z  a  b)))
> (define (car z)
    (z (lambda (p q) (* p 2))))
> (car (cons 1 2))
2
> (define (cdr z)
    (z (lambda (p q) (* q 3))))
> (cdr (cons 1 2))
6
> (define (add x)
    (+ (car x) (cdr x)))
> (add (cons 1 2))
8
> (add (cons 2 3))
13

scheme 利用过程来性表达一些数据的复合能力

这种有关的程序设计风格通常称为 消息传递。

然而也体现了scheme的数据与程序的模糊性


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!

传递自定义对象类型参数 上一篇
接受复杂对象 下一篇