Racket 中 list 和 list* 的区别

X10*_*10D 2 scheme racket

在读的时候:

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

我碰到 list*

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

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

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

Ale*_*uth 7

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)
Run Code Online (Sandbox Code Playgroud)

在 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)
Run Code Online (Sandbox Code Playgroud)

就像cons如果您将其他内容作为“其余”传递,则不会产生正确列表一样,list*也会这样做。

> (equal? (cons 1 2) (list* 1 2))
#true
> (equal? (cons 1 (cons 2 3)) (list* 1 2 3))
#true
Run Code Online (Sandbox Code Playgroud)

这些事情是缺点,但它们不是正确的列表。

但是最常见的用法list*应该使用适当的列表作为最后一个参数。如果您正在寻找与 的关系list,那么

> (list* 1 2 3 4 '())
(list 1 2 3 4)
Run Code Online (Sandbox Code Playgroud)

使用list*with'()作为最后一个参数将等同于list不使用它。

  • list* 不像append 那样工作,但是有一个关系。`(list* abc ... d)` 与 `(append (list abc ...) d)` 相同 (2认同)