球拍中列表和列表*之间的差异

问题描述 投票:0回答:1

同时阅读:

https://docs.racket-lang.org/reference/pairs.html

我遇到了list*

类似于列表,但最后一个参数用作结果的尾部,而不是最终元素。仅当最后一个参数是列表时,结果才是列表。

“:“最后一个参数用作结果的尾部,而不是最终元素”是什么意思?我认为列表总是以空列表结尾:'()

并且如果:“仅当最后一个参数是列表时,结果才是列表”,那么还有什么呢?我认为计划中的所有内容都是清单。

scheme racket
1个回答
0
投票

[将list*看作不是list的变体,而是cons的变体可能更有意义。

> (cons 1 (list 2 3 4))
(list 1 2 3 4)
> (list* 1 (list 2 3 4))
(list 1 2 3 4)

在2个参数上,(list* fst rst)产生与(cons fst rst)相同的东西。

[当有更多参数时,list*将它们全部添加为cons的多参数版本。

> (cons 1 (cons 2 (cons 3 (list 4 5)))
(list 1 2 3 4 5)
> (list* 1 2 3 (list 4 5))
(list 1 2 3 4 5)

就像cons如果您通过“ rest”传递其他内容一样,它不会产生适当的列表,list*也会这样做。

> (equal? (cons 1 2) (list* 1 2))
#true
> (equal? (cons 1 (cons 2 3)) (list* 1 2 3))
#true

但是list*的最常用用法应使用适当的列表作为最后一个参数。如果您要查找与list的关系,则

> (list* 1 2 3 4 '())
(list 1 2 3 4)

使用list*作为最后一个参数将等于'()

© www.soinside.com 2019 - 2024. All rights reserved.