一致するすべての値を返す「assoc」のような関数はありますか?


7

このassoc KEY LIST関数は、alistcarがに等しいの最初の要素を返しますKEY

車がに等しいのすべての要素をサブアリストまたは値のリストとして返す組み込みのEmacs Lisp関数はありますか?結局のところ、が一意のキーを持つ必要はありません。alistKEYalist

あれは、

(assoc foo '((foo . 5) (bar . 6) (foo . 7))) = '(foo . 5)

だが、

(assoc-all foo '((foo . 5) (bar . 6) (foo . 7))) = '((foo . 5) (foo . 7))

回答:


6

このようなもの?

(require 'cl-lib)

(cl-remove-if-not (apply-partially #'equal 'foo)
                  '((foo . 5) (bar . 6) (foo . 7))
                  :key #'car)

=> ((foo . 5) (foo . 7))
(defun assoc-all (key list &optional testfn)
  "Like `assoc', but returns the list of all matching elements."
  (cl-remove-if-not (apply-partially (or testfn #'equal) key)
                    list :key #'car))

1
接頭辞の関数名してください#'代わりにはちょうど'(両方のための作品これは、関数の参照でコンパイラに指示する'equal'car)..
ダミアンCassou

完了しました。私の知る限り、これは完全にこの例では冗長であるが、 -それは何かをする場合にのみ影響を与えるcarか、equalいや、定義されていない可能性がありますか?
フィル、2018年

あなたの定義によれば、定義#'された関数のみを参照することになっているので、常に冗長です:-)。関数参照を常にシャープに引用するのは良い習慣だと思います。そして、ご存知のように、バイトコンパイラはいつかこの情報を使用してコードを最適化するかもしれません:-)。
Damien Cassou、

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.