如何在scheme中像python一样进行追加?

如何在scheme中像python一样进行追加?,python,lisp,scheme,append,racket,Python,Lisp,Scheme,Append,Racket,像这样: > (my-append (list 1 2) 3) '(1 2 3) 我知道racket中的append实际上是连接两个列表。 而cons只需在列表的头部添加一个元素,而不是尾部 有人对此有想法吗?我不知道“像python一样附加”是什么意思,但如果您只想在列表末尾插入一个新元素,可以使用以下方法: (define (my-append lst el) (append lst (list el))) 在Pyton中,append()方法修改列表: lst = [1, 2

像这样:

> (my-append (list 1 2) 3)
'(1 2 3)
我知道
racket
中的
append
实际上是连接两个列表。 而
cons
只需在列表的头部添加一个元素,而不是尾部


有人对此有想法吗?

我不知道“像python一样附加”是什么意思,但如果您只想在列表末尾插入一个新元素,可以使用以下方法:

(define (my-append lst el)
  (append lst (list el)))
在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一样”:

实际上,Scheme的
append
过程的行为与Python的
+
列表之间的操作类似:

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

lst
=> [1, 2]

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

如果你在Racket中,你可能想查看可增长向量库()。这提供了一种容器类型,它支持Python的可扩展列表中使用的许多特性

例如:

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

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

Python的append方法是对支持自动增长的向量式数据结构的一种变异。需要注意的是,Python使用的术语“列表”应该定义为“可增长、可变的向量”。
#lang racket
(require data/gvector)
(define lst (gvector 1 2))
(gvector-add! lst 3)
(for ([elt lst]) (printf "I see: ~s\n" elt))