コンピュータプログラミングにおいて、一部の高水準プログラミング言語でリンクされたリストまたは配列を連結するappend操作。
リスプ
Appendプログラミング言語 Lispに由来します。このappend手順は、0 個以上の(リンクされた) リストを引数として受け取り、これらのリストの連結を返します。
(追加' ( 1 2 3 ) ' ( a b ) ' () ' ( 6 )) ;出力: (1 2 3 ab 6)
このappend手順では最後の引数を除くすべての引数を完全にコピーする必要があるため、要素のリストの場合、時間と空間の計算量は両方ともO( n )になります。したがって、コード内で不用意に使用すると、非効率の原因となる可能性があります。
プロシージャnconc( Schemeappend!で呼び出される) は と同じ機能を実行しますが、破壊的に実行されます。つまり、各引数のcdr を変更し(最後の引数は保存)、次のリストを指します。
append
実装
Appendはを使って簡単に再帰的に定義できますcons。以下は、2 つの引数のみを持つ Scheme での簡単な実装です。
(定義追加(ラムダ( ls1 ls2 ) ( if ( null? ls1 ) ls2 ( cons ( car ls1 ) ( append ( cdr ls1 ) ls2 )))))
追加は fold-right を使用して実装することもできます。
(定義追加( lambda ( a b ) (折り畳み右cons b a )))
その他の言語
Lisp に続いて、リンク リストを基本データ構造として採用している他の高水準プログラミング言語も を採用しています。リストを追加するには、演算子として、Haskell ではを使用し、OCaml ではを使用します。
append++@
他の言語では+、または記号を使用して、文字列、リスト、または配列
++を非破壊的に連結します。
プロローグ
論理プログラミング言語Prolog には組み込みappend述語があり、次のように実装できます。
([], Ys , Ys )を追加します。
([ X | Xs ], Ys ,[ X | Zs ])を追加します:- ( Xs , Ys , Zs )を追加します。
この述語はリストの追加だけでなく、リストを分割するためにも使用できます。
?- ( L , R ,[ 1 , 2 , 3 ] )を追加します。
解は次のようになります:
L = []、R = [1、2、3]; L = [1]、R = [2、3]; L = [1, 2]、R = [3]; L = [1, 2, 3]、R = []
ミランダ
Mirandaでは、Hughes (1989:5-6) のこの右折り畳みは、2 つの引数に対して、上記の Scheme 実装と同じ意味 (例による) を持ちます。
追加 ab = 削減 cons ba
ここで、reduce は Miranda によるfoldの名前であり、cons は2 つの値またはリストからリストを構築します。
例えば、
追加 [1,2] [3,4] = 削減 cons [3,4] [1,2]
= (cons [3,4] を減算) (cons 1 (cons 2 nil))
= 定数 1 (定数 2 [3,4]))
(consをconsに、nilを[3,4]に置き換える)
= [1,2,3,4]
ハスケル
Haskellでは、この右折り畳みは上記の Scheme 実装と同じ効果を持ちます。
追加:: [ a ] -> [ a ] -> [ a ]追加xs ys = foldr ( : ) ys xs
これは本質的には Haskell の演算子の再実装です++。
パール
Perlでは、push 関数は append メソッドと同等であり、次のように使用できます。
my @list ; push @list , 1 ; push @list , 2 , 3 ;
最終結果は[1, 2, 3]を含むリストになります。
unshift関数はリストの最後ではなく先頭に追加します。
私の@list ; unshift @list 、1 ; unshift @list 、2 、3 ;
最終結果は[2, 3, 1]を含むリストになります。
ファイルを開くときは、上書きではなく「>>」モードを使用して追加します。
open ( my $fh , '>>' , "/some/file.txt" ); print $fh "Some new text\n" ; close $fh ;
ファイル ハンドルを開いたり閉じたりするときには、必ず戻り値を確認する必要があることに注意してください。
パイソン
Pythonでは、リストを追加するにはリストメソッドextendまたは中置演算子+とを使用します+=。
>>> l = [ 1 , 2 ]
>>> l . extend ([ 3 , 4 , 5 ])
>>> l
[1, 2, 3, 4, 5]
>>> l + [ 6 , 7 ]
[1, 2, 3, 4, 5, 6, 7]
リストに
単一のappend要素を追加するリスト メソッドと混同しないでください。
>>> l = [ 1 , 2 ]
>>> l 。追加( 3 )
>>> l
[1, 2, 3]
バッシュ
Bashでは、追加リダイレクトは、次の一連のシェル コマンドのように、ストリームを追加するために ">>" を使用します。
echo Hello world! >text ; echo Goodbye world! >>text ; cat text
最初のコマンドで書き込まれたテキスト ファイルに、ストリーム「Goodbye world!」が追加されます。「;」は、指定されたコマンドを同時にではなく順番に実行することを意味します。したがって、テキスト ファイルの最終的な内容は次のようになります。
こんにちは世界!
さようなら世界!
参考文献
- Hughes, John (1989). 「関数型プログラミングが重要な理由」(PDF) . Computer Journal . 32 (2): 98–107. doi :10.1093/comjnl/32.2.98. 2007-04-13 にオリジナル(PDF)からアーカイブされました。
- Steele, Guy L. Jr. (1990)。『Common Lisp : 言語』(第 2 版): 418 ページ。
{{cite journal}}:ジャーナルを引用するには|journal=(ヘルプ)の説明が必要ですappend。
