Highlighting ssyntax characters is tough, especially when they're also valid characters within other symbols (controlled by the &iskeyword variable in Vim). Particular culprits are #. and #+. i.e., if we exclude 46 (ASCII code for #.) from &iskeyword, we get:
; :set isk-=46
-.a ; == (- a) and highlights the #- and the #. as such
-.1 ; == -0.1, but highlights like -.1 == (- 1) since the subtraction
; function (-) is a keyword, which takes highlighting priority over
; anything else
-0.1 ; the good news: this still highlights like a number
But if we add it:
; :set isk+=46
-.a ; == (- a) doesn't highlight the #- because keywords (like the
; subtraction function) must occur as whole words, and #. is right next
; to #- here.
-.1 ; == -0.1 highlights just fine
-0.1 ; this still highlights like a number
Since the numbers can be written with leading zeroes, the ssyntax seems more common, and I can't think of any other edge-cases, I decided to go with the first option here.
But #+ is a valid keyword character; unlike #\:, #\~, #., and #!, it's actually in existing function names. So, &iskeyword //needs// to have 43 (ASCII code for #+). But then
positive ; highlights just fine
odd ; highlights just fine
positive+odd ; only highlights the + as ssyntax and does not highlight
; positive or odd since "positive+odd" runs together as a single
There's not much to do about this. It should be fixed by using a better character for #+ (I can think of no reason to include #\& in &iskeyword once it becomes ssyntax): http://arclanguage.org/item?id=10098
It might also be solved by pulling off even more hacks, like special-casing #+, #-, and other characters that can appear in numbers into //syn-match//es instead of //syn-keyword//s, but this is very unappealing. If there are any Vim / regular expression wizards that can help, I'd appreciate it.