Dies verursacht einen Fehler
(cl-destructuring-bind
(&key a b)
'(:a "foo" :b 13 :c "bar")
(list a b))
weil der :c
Schlüssel / Wert in der Musterübereinstimmung nicht behandelt wird.
Oft möchte ich eine Teilmenge von Schlüsseln / Werten aus einer Liste extrahieren, bin aber cl-destructuring-bind
aufgrund dieser Einschränkung nicht geeignet.
Gibt es eine Möglichkeit, nicht cl-destructuring-bind
übereinstimmende Schlüssel im EXPR einfach zu ignorieren? Ich bin mir nicht sicher, wie das offizielle allgemeine Lisp-Verhalten hier aussehen soll. Ist der Fehler in der Spezifikation?
Beachten Sie, dass die Dash-Bibliothek eine ähnliche Destrukturierung unterstützt, für die jedoch ein -let
Boilerplate erforderlich ist, um jedem Schlüssel ein Symbol zuzuweisen. Ein Fix wurde vorgeschlagen
Unter Berücksichtigung der Antwort von Stefan funktioniert dies gut:
(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)