The difference between data and function
其实我想说有时候过程和数据并没有什么区别(sometime)
例如 racket
(define A (cons 1 (cons 2 (cons 3)))) 定义了一个list
你会把A看作是一个数据,他里面放着一些数字,1 2 3
如果我们自己来实现cons,frist(or car),rest(or cdr). 我们也许会使用如下的定义
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
(define-struct pair [left right]) (define our_cons? pair?) (define (our_cons a_value a_list) (cond [(empty? a_list) (make-pair a_value a_list)] [(our_cons? a_list) (make-pair a_value a_list)] [else (error "第二个参数应该是一个list")])) (define (our_first a_list) (cond [(empty? a_list) (error 'a_list "不能为空")] [else (pair-left a_list)])) (define (our_rest a_list) (cond [(empty? a_list) (error 'a_list "不能为空")] [else (pair-right a_list)])) |
以上数据就是数据,our_first,our_rest,our_cons都是动作,这些函数所产生的就是数据
我们来看另一种实现
1 2 3 4 5 6 7 8 9 10 11 |
这里就不一样了,你以为 racket
(my_cons 'a 'b) 会的到一个数据,实际上他返回的是一个函数(也就是说是一个过程)
first和rest的设计也更加的奇特,将这个过程应用不同的值,就分别取了first和rest部分
在这里数据和函数被混淆了,数据真的是数据吗?数据和一个过程的区别在哪里? 第二个版本的实现也确实更加的优雅