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
,因此为了避免混淆,最好避免重用这些名称。但说它们是“方案中预定义的过程”是不正确的。