cl-phá hủy-ràng buộc trên một phần?


9

Đ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ì :ckhó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-bindkhô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)

Câu trả lời:


10

cl-destructuring-bindsử dụng quy ước đối số của CommonLisp, bạn sẽ có thể thực hiện:

(cl-destructuring-bind 
    (&key a b &allow-other-keys) 
    '(:a "foo" :b 13 :c "bar") 
  (list a b))

1
Không chỉ đơn thuần là nên có thể để có thể. Nó thực sự làm việc.
Harald Hanche-Olsen

Tôi đã viết một macro để làm cho nó dễ sử dụng hơn
fommil

Tôi đã nhận được một số lỗi không thể lặp lại kỳ lạ với macro này, được cl-destructuring-bindbiết là có bất kỳ vấn đề nào không? github.com/ensime/ensime-emacs/issues/458
fommil

Tôi không nghĩ rằng có những vấn đề đã biết trong cl-destructuring-bind(tốt, có một số vấn đề nhỏ nhưng không có vấn đề nào dẫn đến hành vi không chính xác, AFAIK). OTOH Tôi không chắc nó đã được thử nghiệm bao nhiêu.
Stefan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.