2

このような:

> (my-append (list 1 2) 3)
'(1 2 3)

私が知っappendているのracketは、実際には2つのリストを連結することです。そして、テールの代わりにリストの先頭consに要素を追加するだけです

誰かがこれについてアイデアを持っていますか?

4

3 に答える 3

5

Pyton では、append()メソッドはリストをその場で変更します。

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

lst
=> [1, 2, 3]

Racket のリストはデフォルトで不変です。インプレースに最も近いものをappend()使用するには、可変リストを使用する必要があり、追加する要素を独自のリストにパックする必要があります。

(require scheme/mpair)

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

lst
=> (mlist 1 2 3)

プロシージャで不変リストを使用appendすると、新しいリストが生成され、元のリストは変更されないことに注意してください。したがって、「Python のように」はなりません。

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

lst
=> (list 1 2)

実際、Scheme のappend手順は Python の+リスト間の操作と同じように動作します。

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

lst
=> [1, 2]

考えてみると、Python にappend()は誤解を招く名前が付いている可能性があります。ほとんどの関数型プログラミング言語では、追加操作は常に 2 つのリスト間で定義されますが、Python ではリストと要素の間の操作です。add()Javaのインターフェースのadd()操作のように、もっと良い名前だったかもしれません。List

于 2012-12-06T13:37:01.877 に答える
3

Racketを使用している場合は、拡張可能なベクトルライブラリ( data / gvector )を調べたいと思うでしょう。これにより、Pythonの拡張可能なリストで慣れている機能の多くをサポートするコンテナータイプが提供されます。

例:

#lang racket
(require data/gvector)
(define lst (gvector 1 2))
(gvector-add! lst 3)
(for ([elt lst]) (printf "I see: ~s\n" elt))

そうでなければ、あなたの質問は次のようになります:不変のリンクリストを可変の順次割り当てられた配列のように機能させるにはどうすればよいですか?そして、それはうまく機能しません。データ型はさまざまな理由で異なります。

于 2012-12-06T23:46:39.943 に答える
0

「python のように追加する」とはどういう意味かわかりませんが、リストの最後に新しい要素を挿入することだけが必要な場合は、これを使用できます。

(define (my-append lst el)
  (append lst (list el)))
于 2012-12-06T12:00:19.217 に答える