(define (merge-se . ses*) ; later occurrences take precedence to earlier ones (let ([table (make-hash-table)] [rses (reverse ses*)]) (let loop ([ses (cdr rses)] [last-se (car rses)] [se2 (car rses)]) (cond [(null? ses) se2] [(eq? last-se (car ses)) ;;(print "shortcut!") (loop (cdr ses) last-se se2)] [else (let lp ([se (car ses)] [se2 se2]) (cond [(null? se) (loop (cdr ses) (car ses) se2)] [(hash-table-exists? table (caar se)) (lp (cdr se) se2)] [else (hash-table-set! table (caar se) #t) (lp (cdr se) (cons (car se) se2))]))]))))