Điều này gây ra lỗi
(cl-destructuring-bind
(&key a b)
'(:a "foo" :b 13 :c "bar")
(list a b))
bởi vì :c
khóa / giá trị không được xử lý trong mẫu khớp.
Thường thì tôi thấy mình muốn trích xuất một số tập hợp con của các khóa / giá trị từ một số nhiều, nhưng cl-destructuring-bind
không phù hợp vì giới hạn này.
Có cách nào để cl-destructuring-bind
đơn giản bỏ qua các phím chưa từng có trong EXPR không? Tôi không chắc chắn những hành vi phổ biến chính thức được cho là ở đây, là lỗi trong thông số kỹ thuật?
Lưu ý rằng thư viện dấu gạch ngang có một số hỗ trợ cho việc hủy tương tự -let
, nhưng điều đó đòi hỏi một số mẫu soạn sẵn để gán ký hiệu cho mỗi khóa. Một sửa chữa đã được đề xuất
Nếu tính đến câu trả lời của Stefan, điều này hoạt động tốt:
(defmacro plist-bind (args expr &rest body)
"`destructuring-bind' without the boilerplate for plists."
`(cl-destructuring-bind
(&key ,@args &allow-other-keys)
,expr
,@body))
(plist-bind
(a b)
'(:a "foo" :b 13 :c "bar")
(list a b)) => ("foo" 13)