merge-se added by megane on Tue Jul 17 15:06:49 2018

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