From Newsgroup: comp.lang.scheme
Raffael Cavallaro wrote:
Indeed. Here's rob Warnock's version with the full boat of loop
keywords using triplets instead of an association list:
CL-USER 22 > (defun find-maximizing-item (list &key (key #'identity)
(test #'<))
(loop for item in list
for value = (funcall key item)
and position from 0
for current-triplet = (list item value position)
as max-triplet = current-triplet
then (if (funcall test (second max-triplet)
(second current-triplet))
current-triplet
max-triplet)
finally return
(values (first max-triplet) (second max-triplet) (third max-triplet))))
Rejected by ABCL:
Debugger invoked on condition of type PROGRAM-ERROR:
Rejected by SBCL:
; A compound form was expected, but RETURN found.
; current LOOP context: FINALLY RETURN (VALUES (FIRST MAX-TRIPLET)
; (SECOND MAX-TRIPLET)
; (THIRD MAX-TRIPLET)).
Gauche Scheme
(use srfi-1) ;; second
(define (maximizing-item the-list :key (key identity))
(fold
(lambda (item i best)
(let ((value (key item)))
(if (or (null? best) (> value (second best)))
(list item value i)
best)))
'()
the-list
(lrange 0)))
(maximizing-item '("bells" "usher" "ullalume" "poe") :key string-length)
===>
("ullalume" 8 2)
--- Synchronet 3.22a-Linux NewsLink 1.2