次のように、2つのプロパティリストをマージする標準のElispライブラリ関数が見つかりません。
(setq pl nil)
(setq pl (plist-put pl 'key-1 'value-1))
(setq pl (plist-put pl 'key-2 'value-2))
で何かを構築できますがdolist
、その前に、ライブラリの既存の関数を見落としていないことを確認したいと思います。
コメントに基づく更新:
- 「多方向」コメントへの応答:
私はそのような関数は存在しないと想像します。異なる(そして有効な)可能性のある質問に対する回答が存在するためです。異なる値を持つ重複したプロパティ名がある場合はどうすればよいですか?
はい、重複をマージする方法についての質問がありますが、それに対処する方法は比較的少数です。一般的なアプローチは2つあります。まず、引数の順序で重複を解決できます。たとえば、Clojureのマージのように、右端の勝利。第2に、Rubyのmergeの場合と同様に、マージはユーザー指定のコールバック関数に委任できます。
いずれにせよ、さまざまな方法があるという事実は、他の多くの言語標準ライブラリがマージ機能を提供することを妨げません。同じ一般的な議論はソートについても言えますが、Elispはソート機能を提供します。
- 「詳しく説明していただけませんか?」/「探している動作を正確に指定してください。」
一般的に言って、私はElispコミュニティーが使用するものにオープンです。特定の例が必要な場合は、次の例が機能します。
(a-merge-function '(k1 1) '(k2 2 k3 3) '(k3 0))
そして戻る
'(k1 1 k2 2 k3 0))
これは、Clojureのマージのように、最も右勝者のスタイルになります。
- 「それらはリストなので、追加するだけですか?」
いいえ、プロパティリストのセマンティクスappend
は保持されません。この:
(append '(k1 1 k2 2) '(k2 0))
これを返します:
(k1 1 k2 2 k2 0)
appendは、「Cソースコード」の組み込み関数です。
(シーケンスに残りを追加)
すべての引数を連結し、結果をリストにします。結果は、要素がすべての引数の要素であるリストです。各引数は、リスト、ベクトル、または文字列です。最後の引数はコピーされず、新しいリストの末尾として使用されます。
- 「そしてあなたの例はマージのようなものを何も示していません-それは2つのプロパティリストさえ示していません。」
はい、そうです; マージは段階的に行われます。Elispのドキュメント化されたプロパティリスト関数を使用してマージを行うと、非常に冗長になることを示しています。
(setq pl nil)
(setq pl (plist-put pl 'key-1 'value-1))
(setq pl (plist-put pl 'key-2 'value-2))
の結果の出力値を表示するだけですpl
。
(key-1 value-1 key-2 value-2)
繰り返しになりますが、私はこの問題を解決する関数を書くことができますが、最初に、そのような関数が一般的に使用されている場所に存在するかどうかを知りたいと思いました。
最後に、不明な点があるために質問に反対票を投じた場合は、私が明確にするためにいくらかの努力を払ったことを今再考するようにお願いします。これは研究の不足ではありません。「リスト」に関するElispのドキュメントは質問に答えません。
append
。(let ((args '((:a 1 :b 1) (:b 2) (:a 3)))) (apply #'append (reverse args))) => (:a 3 :b 2 :a 1 :b 1)
これは、(:a 3 :b 2 :a 1)
plist関数を使用してplistにアクセスするだけの場合と同じです。
plist-get
もplist-member
気にしません。この点で、それらは連想リストと同様に動作するように見えます(plist-get '(:a "a" :b "b" :a "c") :a) ==> "a"
。一方、(plist-put '(:a "a" :b "b" :a "c") :a "d")
最初の:a
キーの値を置き換えますが、2番目のキーは置き換えません。
append
?