loopの疑問
CL-USER> (setq alist '((1 . 1) (1 . 3) (1 . 2))) ((1 . 1) (1 . 3) (1 . 2)) CL-USER> (loop for (a . b) in alist maximize (+ a b)) 4
足して最大になるような「数字の組」を求めたい。
loopマクロでできるのかな??
値は出るんだけどなー。
多値で(+ a b)が最大になる(a . b)も出してくれたらいいのに…
min, max関数は数値しか取れなくてがっかり…
こういうことってかなり基本的なことだと思うけど、どうやるんだろうね。
と思ったらOn Lispにその関数が載ってあった。こんなのまで自分で作らないといけないなんて悲しすぎる。
(defun most (scoring-fn lst) "Return the element and the score that returns the highest values of the scoring-fn. Scoring-fn is a function that returns a fixnum." ; LMH (declare (function scoring-fn)) ; LMH (if (null lst) (values nil nil) (let* ((wins (car lst)) (max (funcall scoring-fn wins))) (declare (fixnum max)) ; LMH scoring-fn must return fixnum (dolist (obj (cdr lst)) (let ((score (funcall scoring-fn obj))) (declare (fixnum score)) ; LMH scoring-fn must return fixnum (when (> score max) (setq wins obj max score)))) (values wins max))))