例1:代码作为数据
使用函数(代码)实现序对(数据结构):
def cons(x,y):
def dispatch(m):
if m==0:
return x
return y
return dispatch
def car(z):
return z(0)
def cdr(z):
return z(1)
测试:
z=cons(3,4)
print car(z),cdr(z)
运行结果:
3 4
有了序对就可以实现更复杂的数据结构,比如list。下面附带实现其简单的3个方法:求长度,遍历,求指定位置元素
def myList(*l):
if len(l)==2:
return cons(l[0],l[1])
else:
return cons(l[0],myList(*l[1:]))
def lengthOfmyList(mylist):
if type(cdr(mylist))==type(0):
return 1+1
else:
return 1+lengthOfmyList(cdr(mylist))
def travList(mylist):
print car(mylist),
if type(cdr(mylist))==type(0):
print cdr(mylist)
else:
travList(cdr(mylist))
def getElement(cons,index):
if index==0:
return car(cons)
if type(cdr(cons))==type(0):
if index-1==0:
return cdr(cons)
else:
return getElement(cdr(cons),index-1)
测试:
z = myList(0,1,2,3,4,5,6)
travList(z)
print lengthOfmyList(z)
print getElement(z,5)
运行结果:
0 1 2 3 4 5 6
7
5
例2:数据作为代码
存储在硬盘里的源代码就是普通的字符串数据,但是把它输送给解释器执行时,它就发挥了代码的功能。
其他例子,如:
图灵构造图灵停机问题证明不可判定性命题(将图灵机(函数)编码为其他图灵机的纸带输入(数据))
DNA的自我复制
等等
参考文献:
[1] 《Structure and Interpretation of Computer Programs》 Harold Abelson、Gerald Jay Sussman