add declarative lexer docs
reimplement BatList.unique_cmp

to take the first rather than the last unique element