or
や and
を apply
したい。
つまり、いろんな操作によって得られたリストに対して or
や and
がとりたい。
なんでこんな面倒なことをしてるんだと思ったら、andがsubrだからapplyできないのか。
— Conao3 (@conao_3) March 28, 2020
この問題、CLerはどうやって解決するんだろう #lisp pic.twitter.com/cmwx3p8ABm
(every #'identity <list>) というのも。
— Shiro Kawai (@anohana) March 28, 2020
河合さんに 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
たしかに上手くいっている。 every
は and
相当だったので、 some
は or
相当となる。
(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)