像这样:
> (my-append (list 1 2) 3)
'(1 2 3)
我知道append
inracket
实际上是连接两个列表。cons
只需将元素添加到列表的头部而不是尾部
有人对此有想法吗?
在 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
。
如果您在 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))
否则,您的问题最终会归结为:如何使不可变链表像可变顺序分配的数组一样工作?这不会很好地工作:数据类型因不同的原因而不同。
我不知道“append like python”是什么意思,但如果你只想在列表末尾插入一个新元素,你可以使用这个:
(define (my-append lst el)
(append lst (list el)))