これによりエラーが発生します
(cl-destructuring-bind
(&key a b)
'(:a "foo" :b 13 :c "bar")
(list a b))
:cキー/値はパターン一致で処理されないためです。
多くの場合、plistからキー/値のサブセットを抽出したいと思ってcl-destructuring-bindいますが、この制限のため適切ではありません。
cl-destructuring-bindEXPRで一致しないキーを単に無視する方法はありますか?公式の一般的なlispの動作がどうなっているのかわかりませんが、仕様のエラーですか?
ダッシュライブラリは、を使用した同様のデストラチャをサポートしています-letが、各キーにシンボルを割り当てるためのボイラープレートが必要です。修正が提案されています
ステファンの答えを考慮に入れると、これはうまくいきます:
(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)