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))))