以前读 SICP ,虽然很有趣,但并没有讲 cons
、car
与cdr
是怎样实现的。今天读 the implementation of functional programming languages ,里面讲到了如何用lambda
实现这三个函数,这里给出用 scheme 和 javascript 改写的版本。
Scheme
(define (cons a b) (lambda (f) (f a b))) (define (car c) (c (lambda (a b) a))) (define (cdr c) (c (lambda (a b) b))
命令行里测试下,OK:
> (car (cons 1 2)) 1 > (cdr (cons 2 3)) 3
Javascript
var cons = function(a, b) { return function(f) { return f(a, b) } } var car = function(c) { return c(function(a, b) { return a }) } var cdr = function(c) { return c(function(a, b) { return b }) }
命令行里测试下,OK:
>> car(cdr(cons(1, cons(2, 3)))) >> 2