如何在方案中追加像python一样?

Han*_*Sun 2 lisp python scheme append racket

像这样:

> (my-append (list 1 2) 3)
'(1 2 3)
Run Code Online (Sandbox Code Playgroud)

我知道,appendracket实际上是连接两个列表.而cons只是一个元素添加到了一个列表,而不是尾巴

有没有人有这个想法?

Ósc*_*pez 5

在Pyton中,该append()方法就地修改了列表:

lst = [1, 2]
lst.append(3)

lst
=> [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

默认情况下,Racket的列表是不可变的,最接近就地的东西append()要求你使用可变列表,并且你必须将要附加的元素打包到它自己的列表中:

(require scheme/mpair)

(define lst (mlist 1 2))
(mappend! lst (mlist 3))

lst
=> (mlist 1 2 3)
Run Code Online (Sandbox Code Playgroud)

请注意,在append过程中使用不可变列表将生成一个新列表,保持原始列表不变 - 因此它不会像"Python"一样:

(define lst (list 1 2))
(append lst (list 3))   ; this returns the new list '(1 2 3)

lst
=> (list 1 2)
Run Code Online (Sandbox Code Playgroud)

实际上,Scheme的append过程就像Python +在列表之间的操作一样:

lst = [1, 2]
lst + [3]    # this returns the new list [1, 2, 3]

lst
=> [1, 2]
Run Code Online (Sandbox Code Playgroud)

想想看,Python append()可能有一个误导性的名称 - 在大多数函数式编程语言中,append操作总是在两个列表之间定义,而在Python中它是列表和元素之间的操作.也许add()本来是一个更好的名字,比如Java的界面add()操作List.