2015-05-16 11 views

risposta

10
CL-USER 8 > (reduce #'min '((1) (-1) (3)) :key #'first) 
-1 

o

CL-USER 9 > (loop for e in '((1) (-1) (3)) minimize (first e)) 
-1 

temo ottenere l'elemento contenitore è più difficile:

CL-USER 9 > (defun minimum (list predicate key) 
       (when list 
       (let* ((m0 (first list)) 
         (m1 (funcall key m0))) 
        (mapc (lambda (e0 &aux (e1 (funcall key e0))) 
          (when (funcall predicate e1 m1) 
          (psetf m0 e0 m1 e1))) 
         list) 
        m0))) 
MINIMUM 

CL-USER 10 > (minimum '((a 1) (b -1) (c -2)) #'< #'second) 
(C -2) 

CL-USER 11 > (minimum '((a 1) (b -1)) #'< #'second) 
(B -1) 

CL-USER 12 > (minimum '((a 1)) #'< #'second) 
(A 1) 

CL-USER 13 > (minimum '() #'< #'second) 
NIL 
+0

Questo sembra restituire l'elemento dopo aver applicato la funzione specificata da chiave, restituendo l'attributo. C'è un modo per restituire l'intero elemento stesso? – user2059807

+0

@ user2059807: vedere la modifica ... –

1

Utilizzare la funzione fornita dalla libreria Alexandria: extremum.

(extremum '((a 3) (b 1) (c 2)) #'< :key #'second) 
=> (B 1) 
Problemi correlati