在Python中,使用基于数组的list类比使用Lisp样式的链表更典型.但是它们之间的转换并不太难:
def cons(seq):
result = None
for item in reversed(seq):
result = (item, result)
return result
def iter_cons(seq):
while seq is not None:
car, cdr = seq
yield car
seq = cdr
>>> cons([1, 2, 3, 4, 5, 6])
(1, (2, (3, (4, (5, (6, None))))))
>>> iter_cons(_)
<generator object uncons at 0x00000000024D7090>
>>> list(_)
[1, 2, 3, 4, 5, 6]
Run Code Online (Sandbox Code Playgroud)
警告:以下材料可能不实用!
实际上,cons在Lisp中不需要是原始的,你可以用λ构建它.有关详细信息,请参阅在SICP中使用lambda for cons/car/cdr定义.在Python中,它被翻译为:
def cons(x, y):
return lambda pair: pair(x, y)
def car(pair):
return pair(lambda p, q: p)
def cdr(pair):
return pair(lambda p, q: q)
Run Code Online (Sandbox Code Playgroud)
现在,car(cons("a", "b"))应该给你'a'.
那个怎么样?前缀方案:)
显然,您可以使用cdr递归开始构建列表.您可以nil在Python中定义为空对.
def nil(): return ()
Run Code Online (Sandbox Code Playgroud)
请注意,您必须=在Python中使用绑定变量.我对吗?因为它可能会改变变量,所以我宁愿定义常量函数.
当然,这不是Pythonic而是Lispy,不那么实用而且优雅.
练习:在Python中实现Scheme 的列表库http://srfi.schemers.org/srfi-1/srfi-1.html.开玩笑 :)
| 归档时间: |
|
| 查看次数: |
6795 次 |
| 最近记录: |