front back rside lside
(if (or (= front "Y") (= back "Y") (= rside "Y") (= lside "Y")) (setq a "Y"))
(and (vl-some '(lambda (x) (= x "Y")) (list front back rside lside)) (setq a "Y"))
If any of these variables contains the value of "Y" I want to take some action. I've been doing this in the past:Code: [Select](if (or (= front "Y") (= back "Y") (= rside "Y") (= lside "Y")) (setq a "Y"))
... How would one run this process through mapcar/lambda to achieve the same results?
Consider:Code: [Select](setq a
(car
(vl-remove-if-not
(function (lambda (x) (= "Y" x)))
(list front back rside lside)
)
)
)
;; Y at front of list
_FOO6.....1453 / 1.05 <fastest>
_FOO3.....1469 / 1.04
_FOO5.....1469 / 1.04
_FOO2.....1484 / 1.03
_FOO4.....1484 / 1.03
_FOO1.....1531 / 1.00 <slowest>
;; Y at end of list
_FOO5.....1141 / 1.34 <fastest>
_FOO4.....1203 / 1.27
_FOO6.....1219 / 1.26
_FOO3.....1297 / 1.18
_FOO1.....1500 / 1.02
_FOO2.....1531 / 1.00 <slowest>
(defun _foo1 ()
(vl-some (function (lambda (v)
(if (eq (eval v) "Y")
"Y"
)
)
)
(list front back rside lside)
)
)
(defun _foo2 ()
(car (vl-remove-if-not (function (lambda (x) (eq x "Y"))) (list front back rside lside)))
)
(defun _foo3 nil (vl-some (function (lambda (x) (eq x "Y"))) (list front back rside lside)))
(defun _foo4 nil (vl-position "Y" (list front back rside lside)))
(defun _foo5 nil (member "Y" (list front back rside lside)))
(defun _foo6 nil (or (= front "Y") (= back "Y") (= rside "Y") (= lside "Y")))
(defun _foo7 nil (apply 'or (mapcar '(lambda (x) (= x "Y")) (list front back rside lside))))
(benchmark '(_foo1 _foo2 _foo3 _foo4 _foo5 _foo6))
Here's some more benchmarks :).
;; Y at front of list
_FOO2.....1125 / 1.03 <fastest>
_FOO4.....1125 / 1.03
_FOO6.....1125 / 1.03
_FOO7.....1125 / 1.03
_FOO5.....1140 / 1.01
_FOO3.....1141 / 1.01
_FOO1.....1157 / 1.00 <slowest>
;; Y at end of list
_FOO7.....1110 / 1.04 <fastest>
_FOO2.....1125 / 1.03
_FOO3.....1125 / 1.03
_FOO4.....1125 / 1.03
_FOO5.....1125 / 1.03
_FOO6.....1141 / 1.01
_FOO1.....1156 / 1.00 <slowest>
I also missed _foo7 LOL ... Here's new numbers with all functions returning "Y" :PCode - Auto/Visual Lisp: [Select]
;; Y at front of list _FOO2.....1125 / 1.03 <fastest> _FOO4.....1125 / 1.03 _FOO6.....1125 / 1.03 _FOO7.....1125 / 1.03 _FOO5.....1140 / 1.01 _FOO3.....1141 / 1.01 _FOO1.....1157 / 1.00 <slowest> ;; Y at end of list _FOO7.....1110 / 1.04 <fastest> _FOO2.....1125 / 1.03 _FOO3.....1125 / 1.03 _FOO4.....1125 / 1.03 _FOO5.....1125 / 1.03 _FOO6.....1141 / 1.01 _FOO1.....1156 / 1.00 <slowest>
_$ (mapcar 'set '(front back rside lside) '("W" "X" "Y" "Z"))
("W" "X" "Y" "Z")
_$ front
"W"
_$ back
"X"
_$ rside
"Y"
_$ lside
"Z"
That shows what's happening with mapcar. The equivalent (if not using mapcar) would have been: