Lispでスペシャルフォームのorやandをapplyする方法

orandapply したい。

つまり、いろんな操作によって得られたリストに対して orand がとりたい。

河合さんに every を教えてもらいました。

(mapcar #'featurep '(emacs leaf use-package-leaf))
;;=> (t t nil)

(cl-every #'identity (mapcar #'featurep '(emacs leaf use-package-leaf)))
;;=> nil

(cl-every #'identity (mapcar #'featurep '(emacs leaf)))
;;=> t

たしかに上手くいっている。 everyand 相当だったので、 someor 相当となる。

(cl-some #'identity (mapcar #'featurep '(emacs leaf)))
;;=> t

(cl-some #'identity (mapcar #'featurep '(use-package-leaf use)))
;;=> nil

もちろん、今回の方法はスペシャルフォームではないので、評価してはいけない式が後続している場合、普通にエラーになる。

(or nil t (/ 1 0))
;;=> t

(cl-some #'identity (list nil t (/ 1 0)))
;;=> Debugger entered--Lisp error: (arith-error)
;;     /(1 0)
;;     (list nil t (/ 1 0))
;;     (cl-some (function identity) (list nil t (/ 1 0)))
;;     eval((cl-some (function identity) (list nil t (/ 1 0))) nil)
;;     scratch-comment--elisp--eval-last-sexp(t)
;;     scratch-comment--eval-last-sexp(t)
;;     scratch-comment-eval-sexp()
;;     funcall-interactively(scratch-comment-evalp-sexp)
;;     call-interactively(scratch-comment-eval-sexp nil nil)
;;     command-execute(scratch-comment-eval-sexp)