関数は、シーケンスのany
要素に対して関数(または述語)を評価し、述語がシーケンスのいずれかの要素に対してtrueを返す場合はtrueを返します。したがって
(any `stringp `(42 t "yes" nil))
..nil以外を返し、
(any `stringp `(42 t nil 89))
...nilを返します。
CLモジュールには機能があると思いますが、some
使いたくありません。
mapcを使用して単純な実装を作成するのは簡単です。
(defun my-any (predicate sequence)
"Return true if PREDICATE is true of any element of SEQUENCE.
If so, return the first non-nil value returned by PREDICATE.
"
(let (result)
(mapc '(lambda (elt)
(or result
(setq result (funcall predicate elt))))
sequence)
result))
しかし、誰かがこれに最適化または改善を提供できますか?これを行うためのより速い、よりクリーンな、またはより慣用的なelispの方法はありますか?特に、最初のシーケンスが起動したときにシーケンス全体のマッピングを停止するための最良の方法は何ですか?mapcを「展開」することはできますが、それが最善の方法ですか?
私は使うことができると思いますcatch
が、それは実際にはそれが節約するよりも多くの費用がかかるかもしれません。
チップ?