このような:
> (my-append (list 1 2) 3)
'(1 2 3)
私が知っappend
ているのracket
は、実際には2つのリストを連結することです。そして、テールの代わりにリストの先頭cons
に要素を追加するだけです
誰かがこれについてアイデアを持っていますか?
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
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))
そうでなければ、あなたの質問は次のようになります:不変のリンクリストを可変の順次割り当てられた配列のように機能させるにはどうすればよいですか?そして、それはうまく機能しません。データ型はさまざまな理由で異なります。
「python のように追加する」とはどういう意味かわかりませんが、リストの最後に新しい要素を挿入することだけが必要な場合は、これを使用できます。
(define (my-append lst el)
(append lst (list el)))