任何人都可以帮助编写一个lisp代码来查找满足列表中谓词的第一个元素

时间:2017-10-01 23:10:44

标签: lisp common-lisp

任何人都可以帮我写一下常用的lisp代码吗?如下: 创建一个查找第一个谓词列表函数,以返回满足条件的第一个元素已在列表中给出,如果没有元素可以满足则为零。

(find-first #'oddp '(1 2 3)) returns 1.
(find-first #'characterp '(1 2 3 4 5 6 #\a))

2 个答案:

答案 0 :(得分:2)

递归:

(defun find-first (fn ls)
  (cond ((null ls) nil)
        ((funcall fn (car ls)) (car ls))
        (t (find-first fn (cdr ls)))))

迭代使用循环宏:

(defun find-first (fn ls)
  (loop for item in ls
        if (funcall fn item) 
        return item))

通过映射:

mapc 明确用于其副作用。

(defun find-first (fn ls)
  (mapc (lambda (item) 
          (if (funcall fn item) 
              (return-from find-first item))) 
        ls))

功能:

(defun find-first (fn ls)
  (car (remove-if-not fn ls)))

最后;非常直接使用CL标准功能 find-if

find-first 实际上只是 find-if 的别名。

(defun find-first (fn ls)
  (find-if fn ls))

答案 1 :(得分:-1)

(defun find-first (f l) 
   (if (funcall f (car l))
       (car l)
       (find-first f (cdr l))))