-(define (merge-se . ses) ; later occurrences take precedence to earlier ones - (let ((se (apply append ses))) - (dm "merging " (length ses) " se's with total length of " (length se)) - (let ((se2 - (let loop ((se se)) - (cond ((null? se) '()) - ((assq (caar se) (cdr se)) (loop (cdr se))) - (else (cons (car se) (loop (cdr se)))))))) - (dm " merged has length " (length se2)) - se2))) - +(define (merge-se . ses) ; later occurrences take precedence + (let bwd ((ses ses)) + (if (null? ses) + '() + (let fwd ((se (car ses)) + (rest (bwd (cdr ses)))) + (cond ((null? se) rest) + ((assq (caar se) rest) (fwd (cdr se) rest)) + (else (cons (car se) (fwd (cdr se) rest)))))))) +