Scheme 方案中的级联

Scheme 方案中的级联,scheme,Scheme,我有以下代码: (define rest '(((di (a) (b c)) (sh (b) (e d))) ((al (a) (b))))) (define first '((di (a) (5)) (sh (b) (3)))) 我想得到以下列表: (((di (a) (5)) (sh (b) (3))) ((di (a) (b c)) (sh (b) (e d))) ((al (a) (b))))) 也就是说,首先添加列表,作为rest中的第一个元素 当我添加时,它会给我: ((di (

我有以下代码:

(define rest '(((di (a) (b c)) (sh (b) (e d))) ((al (a) (b)))))
(define first '((di (a) (5)) (sh (b) (3))))
我想得到以下列表:

(((di (a) (5)) (sh (b) (3))) ((di (a) (b c)) (sh (b) (e d))) ((al (a) (b)))))
也就是说,首先添加列表
,作为rest中的第一个元素

当我添加
时,它会给我:

((di (a) (5)) (sh (b) (3)) ((di (a) (b c)) (sh (b) (e d))) ((al (a) (b))))
任何其他库函数,或者我尝试做的函数,都没有帮助


谢谢。

Append
将两个列表放在一起。考虑到您有一个
第一个
和一个
其余的
,您可能需要
cons
Cons
获取一个元素并将其添加到列表中。在这种情况下,元素是
first
,列表是
rest
。所以你想要像这样的东西

(cons first rest)

使用
first
rest
作为列表的名称不是一个好主意,因为它们在某些版本的scheme(例如Racket)中是预定义的过程,您将重新定义它们

一个简单的
cons
就可以了,如下所示:

(define fst '((di (a) (5)) (sh (b) (3))))
(define rst '(((di (a) (b c)) (sh (b) (e d))) ((al (a) (b)))))

(cons fst rst)
> (((di (a) (5)) (sh (b) (3))) ((di (a) (b c)) (sh (b) (e d))) ((al (a) (b))))

它之所以有效,是因为您想要获得的列表只是
rst
,但在开始时有一个新元素
fst
(列表),而当您想要将一个列表的元素添加到另一个列表的末尾时,通常会使用
append

标准方案没有
first
rest
;它使用
car
cdr
。有些实现,比如Racket,确实有
first
rest
,因此为了避免混淆,最好避免重用这些名称。但说它们是“方案中预定义的过程”是不正确的。