部分的なplistのcl-destructuring-bind?


9

これによりエラーが発生します

(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)

回答:


10

cl-destructuring-bindCommonLispのarglist規則を使用しているため、次のことができるはずです。

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

1
単に「できるはず」ではない。実際に機能します。
Harald Hanche-Olsen 2016

使いやすくするためにマクロを作成しました
fommil '28

このマクロでいくつかの奇妙な再現不可能なエラーが発生しcl-destructuring-bindていますが、問題があることがわかっていますか?github.com/ensime/ensime-emacs/issues/458
fommil

私には既知の問題はないと思いますcl-destructuring-bind(まあ、いくつかのマイナーな問題がありますが、不正な動作につながるものはありません、AFAIK)。OTOHどれくらいの頻度でテストされているのかわかりません。
Stefan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.