       switch c
         when ' ' then stream.eatSpace(); null
         when '⍝' then stream.skipToEnd(); 'apl-com'
+        when '⋄' then delete h.kw; la.t !in ['(', '['] && 'apl-diam' || 'apl-err'
         when '←' then 'apl-asgn'
         when "'" then (if stream.match /^(?:[^'\r\n]|'')*'/ then 'apl-str' else stream.skipToEnd(); 'apl-err')
         when '⍬' then 'apl-zld'

      oi: 0 #   oi: outer indent -- the indent of the opening token's line
      ii: 0 #   ii: inner indent -- the indent of the block's body; it can be adjusted later
    ]
    # vars: # local names in a tradfn

  token: (stream, h) -> # h:state
    {a} = h; la = last a; n = stream.indentation()
    if stream.sol() && !stream.match /^\s*(:|∇|$)/, false then a[a.length - 1] = $.extend {ii: n}, la
    if h.hdr
      delete h.hdr; stream.match /[^⍝\n\r]*/; s = stream.current()
      if /^\s*:/.test(s) || dfnHeader.test s

        when ']' then (if la.t == '[' then a.pop(); 'apl-sqbr' else 'apl-err')
        when '}' then (if la.t == '{' then a.pop(); "apl-dfn#{1 + dfnDepth a} apl-dfn" else 'apl-err')
        when ';' then la.t == '[' && 'apl-semi' || 'apl-err'
        when '⎕' then stream.match(/[áa-z0-9]*/i)?[0].toLowerCase() in quadNames && 'apl-quad' || 'apl-err'
        when '⍞' then 'apl-quad'
        when '#' then 'apl-ns'
