在读的时候:
https://docs.racket-lang.org/reference/pairs.html
我碰到 list*
与 list 类似,但最后一个参数用作结果的尾部,而不是最后一个元素。仅当最后一个参数是一个列表时,结果才是一个列表。
“最后一个参数用作结果的尾部,而不是最后一个元素”是什么意思?我认为列表总是以空列表结尾:'()
如果:“仅当最后一个参数是列表时,结果才是列表”,那么还有什么?我认为计划中的所有内容都是一个列表。
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不使用它。