如何在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))