code: func lexNumber(l *Lexer) (fn stateFn) {
  	l.acceptRunFn(unicode.IsDigit)
  
  	next := l.next()
  	switch next {
  	case '.':
  		l.accept() // accept the dot
  		l.acceptRunFn(unicode.IsDigit)
  	case '-', '/':
  		// standardize
  		l.r = '/'
  		l.accept()
  		return lexDate
  	case ':':
  		if l.pos-l.start == 3 {
  			l.accept()
  			return lexTime
  		} else {
  			l.backup()
  			l.emit(lingo.Number)
  			return lexPunctuation
  		}
  	default:
  		l.backup()
  	}
  
  	if l.acceptRun("eE") {
  		// handle negative exponents
  		if l.peek() == '-' {
  			l.next()
  			l.accept()
  			return lexNumber(l)
  		}
  		l.acceptRunFn(unicode.IsDigit)
  	}
  	l.backup()
  
  	if l.buf.Len() == 1 && l.buf.Bytes()[0] == '-' {
  		l.emit(lingo.Punctuation) // dash
  		return lexWhitespace
  	}
  	l.emit(lingo.Number)
  	return lexWhitespace
  }
docs: // lexNumber lexes numbers. It accepts runs of unicode digits.
  // Upon stopping, it checks to see if the next value is a '.'. If it is, then it's a decimal value, and continues a run
  // Upon stopping a second time, it checks for 'e' or 'E', for exponentiation - 1.2E2