Tôi chưa tìm thấy chức năng thư viện Elisp tiêu chuẩn để hợp nhất hai danh sách tài sản, như thế này:
(setq pl nil)
(setq pl (plist-put pl 'key-1 'value-1))
(setq pl (plist-put pl 'key-2 'value-2))
Tôi có thể xây dựng một cái gì đó với dolist
, nhưng trước khi tôi làm, tôi muốn kiểm tra xem tôi không xem một chức năng hiện có trong một số thư viện.
Cập nhật, dựa trên các ý kiến :
- Đáp lại bình luận "nhiều cách":
Tôi sẽ tưởng tượng rằng không có chức năng như vậy bởi vì có câu trả lời khác nhau (và có thể hợp lệ) cho câu hỏi: phải làm gì khi bạn có tên thuộc tính trùng lặp với các giá trị riêng biệt?
Vâng, có một câu hỏi về cách hợp nhất các bản sao, nhưng có khá ít cách để giải quyết điều đó. Tôi thấy hai cách tiếp cận chung. Đầu tiên, thứ tự đối số có thể giải quyết các bản sao; ví dụ như chiến thắng ngoài cùng bên phải, như trong hợp nhất của Clojure . Thứ hai, việc hợp nhất có thể ủy quyền cho chức năng gọi lại do người dùng cung cấp, như trong hợp nhất của Ruby .
Trong mọi trường hợp, thực tế là có nhiều cách thực hiện khác nhau không ngăn cản nhiều thư viện chuẩn ngôn ngữ khác cung cấp chức năng hợp nhất. Lập luận chung tương tự có thể nói về sắp xếp, và Elisp cung cấp chức năng sắp xếp.
- "Bạn có thể giải thích?" / "Hãy xác định chính xác hành vi bạn đang tìm kiếm."
Nói chung, tôi cởi mở với những gì cộng đồng Elisp sử dụng. Nếu bạn muốn có một ví dụ cụ thể, đây sẽ là một ví dụ có thể hoạt động:
(a-merge-function '(k1 1) '(k2 2 k3 3) '(k3 0))
Và trả lại
'(k1 1 k2 2 k3 0))
Đây sẽ là một phong cách chiến thắng đúng nhất, như hợp nhất của Clojure.
- "Chúng là danh sách, vì vậy chỉ cần nối thêm?"
Không, append
không bảo tồn danh sách ngữ nghĩa tài sản . Điều này:
(append '(k1 1 k2 2) '(k2 0))
Trả về cái này:
(k1 1 k2 2 k2 0)
append là một hàm dựng sẵn trong 'mã nguồn C'.
(chắp thêm và nghỉ ngơi
Nối tất cả các đối số và làm cho kết quả thành một danh sách. Kết quả là một danh sách có các phần tử là các phần tử của tất cả các đối số. Mỗi đối số có thể là một danh sách, vectơ hoặc chuỗi. Đối số cuối cùng không được sao chép, chỉ được sử dụng làm đuôi của danh sách mới.
- "Và ví dụ của bạn không hiển thị bất cứ điều gì như hợp nhất - nó thậm chí không hiển thị hai danh sách tài sản."
Có nó làm; nó thực hiện hợp nhất từng bước. Nó cho thấy cách thực hiện hợp nhất bằng cách sử dụng các chức năng danh sách tài sản của Elisp rất dài dòng:
(setq pl nil)
(setq pl (plist-put pl 'key-1 'value-1))
(setq pl (plist-put pl 'key-2 'value-2))
Chỉ hiển thị giá trị đầu ra kết quả từ pl
:
(key-1 value-1 key-2 value-2)
Để nhắc lại, tôi có khả năng viết một hàm để giải quyết vấn đề này, nhưng trước tiên tôi muốn tìm hiểu xem một hàm như vậy có tồn tại ở đâu đó trong sử dụng chung không.
Cuối cùng, nếu bạn đánh giá thấp câu hỏi vì bạn thấy nó không rõ ràng, tôi sẽ yêu cầu bạn xem xét lại rằng tôi đã nỗ lực để làm rõ. Đây không phải là một nghiên cứu thiếu. Tài liệu Elisp về "Danh sách" không trả lời câu hỏi.
append
: (let ((args '((:a 1 :b 1) (:b 2) (:a 3)))) (apply #'append (reverse args))) => (:a 3 :b 2 :a 1 :b 1)
giống (:a 3 :b 2 :a 1)
như miễn là bạn chỉ sử dụng các hàm plist để truy cập vào bảng.
plist-get
không plist-member
quan tâm nếu có nhiều khóa giống nhau. Có vẻ như họ hành xử tương tự với những người theo chủ nghĩa này (plist-get '(:a "a" :b "b" :a "c") :a) ==> "a"
. Trong khi đó, (plist-put '(:a "a" :b "b" :a "c") :a "d")
thay thế giá trị của :a
khóa đầu tiên nhưng không phải là khóa thứ hai.
append
?