繁体   English   中英

Common Lisp 有一个 some function。我如何在 elisp 中编写 some 或 any?

[英]Common Lisp has a some function. How can I write some or any in elisp?

any function 将对序列的元素评估 function(或谓词),如果谓词对序列的任何元素返回真,则返回真。 所以

(any `stringp `(42 t "yes" nil))

..将返回非零,并且

(any `stringp `(42 t nil 89))

...将返回零。

我认为 CL 模块中有some function,但我不想使用它。

使用 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器,但实际上成本可能比节省的要多。

尖端?

(defun any (pred list)
  (while (and list (not (funcall pred (car list))))
    (pop list))
  (car list))

至少您可以在谓词为真时提前终止。 像下面这样的东西。

 (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.
"
  (catch 'looking
    (mapc '(lambda (elt)
             (if (funcall predicate elt) (throw 'looking t)))
          sequence)
    nil))

您可能会使用find-if ,在http://www.cs.cmu.edu/Groups/AI/html/cltl/clm/node145.html中有描述

听起来它完全符合你的要求

(find-if 'stringp '(a "yes"))
"yes"
(find-if 'stringp '(a b))
nil

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM