2

像这样:

> (my-append (list 1 2) 3)
'(1 2 3)

我知道appendinracket实际上是连接两个列表。cons只需将元素添加到列表的头部而不是尾部

有人对此有想法吗?

4

3 回答 3

5

在 Pyton 中,该append()方法就地修改列表:

lst = [1, 2]
lst.append(3)

lst
=> [1, 2, 3]

默认情况下,Racket 的列表是不可变的,最接近就地的append()需要您使用可变列表,并且您必须将要附加的元素打包到它自己的列表中:

(require scheme/mpair)

(define lst (mlist 1 2))
(mappend! lst (mlist 3))

lst
=> (mlist 1 2 3)

请注意,在过程中使用不可变列表append将产生一个新列表,而原始列表保持不变 - 所以它不会“像 Python”:

(define lst (list 1 2))
(append lst (list 3))   ; this returns the new list '(1 2 3)

lst
=> (list 1 2)

事实上,Scheme 的append过程就像 Python 的+列表之间的操作一样:

lst = [1, 2]
lst + [3]    # this returns the new list [1, 2, 3]

lst
=> [1, 2]

想一想,Pythonappend()可能有一个误导性的名称——在大多数函数式编程语言中,追加操作总是定义在两个列表之间,而在 Python 中,它是列表和元素之间的操作。也许add()会是一个更好的名字,就像Java的接口add()操作一样List

于 2012-12-06T13:37:01.877 回答
3

如果您在 Racket 中,您可能想要查看可增长的向量库 ( data/gvector )。这提供了一种容器类型,它支持您习惯使用 Python 的可增长列表的许多功能。

例子:

#lang racket
(require data/gvector)
(define lst (gvector 1 2))
(gvector-add! lst 3)
(for ([elt lst]) (printf "I see: ~s\n" elt))

否则,您的问题最终会归结为:如何使不可变链表像可变顺序分配的数组一样工作?这不会很好地工作:数据类型因不同的原因而不同。

于 2012-12-06T23:46:39.943 回答
0

我不知道“append like python”是什么意思,但如果你只想在列表末尾插入一个新元素,你可以使用这个:

(define (my-append lst el)
  (append lst (list el)))
于 2012-12-06T12:00:19.217 回答