LISP在python中有所体现

时间:2011-11-10 01:12:26

标签: python lisp cons

Python中是否有等效的cons? (任何高于2.5的版本)

如果是这样,它是否内置?或者我需要easy_install获取模块吗?

6 个答案:

答案 0 :(得分:7)

在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]

答案 1 :(得分:7)

警告:以下材料可能不实用!

实际上,width: 500px在Lisp中不需要是原始的,你可以用λ构建它。 有关详细信息,请参阅Use of lambda for cons/car/cdr definition in SICP。在Python中,它被翻译为:

cons

现在,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) 应该为您提供car(cons("a", "b"))

那是怎么回事?前缀方案:)

显然,您可以使用'a'递归开始构建列表。您可以将cdr定义为Python中的空对。

nil

请注意,您必须使用Python中的def nil(): return () 绑定变量。我对吗?因为它可能会改变变量,所以我宁愿定义常量函数。

当然,这不是Pythonic而是Lispy,不那么实用而且优雅。

练习:在Python中实现Scheme的列表库http://srfi.schemers.org/srfi-1/srfi-1.html。开个玩笑:)

答案 2 :(得分:3)

请注意,Python的列表实现为向量,而不是链接列表。您可以lst.insert(0, val),但该操作是O(n)。

如果您希望数据结构的行为更像链接列表,请尝试使用Deque

答案 3 :(得分:2)

您可以非常简单地定义一个与cons非常相似的类:

class Cons(object):
    def __init__(self, car, cdr):
        self.car = car
        self.cdr = cdr

然而,这将是构建基本数据结构的一种非常“重量级”的方式,Python没有针对它进行优化,所以我希望结果比在Lisp中做类似的事情要多得多CPU /内存。

答案 4 :(得分:1)

没有。 cons是类似Lisp的语言的实现细节;它在Python中没有任何有意义的意义。

答案 5 :(得分:1)

在Python 3中,您可以使用splat运算符*通过编写[x, *xs]来简化操作。例如:

>>> x = 1
>>> xs = [1, 2, 3]
>>> [x, *xs]
[1, 1, 2, 3]

如果您希望将其定义为函数,那也很容易:

def cons(x, xs):
  return [x, *xs]