anchor.diff:    (and ch (or (alpha-char-p ch)
                 (digit-char-p ch)
                 (member ch '(#\_ #\.)))))
  -
   
   (defun skip-whitespace (stream)
     "Skip all the whitespace characters that are coming up in the stream."
  
positive.code: 
  (in-package "PROTO-IMPL")
  
  (define-constant +SCALAR-TYPES+
    '("int32" "int64" "uint32" "uint64" "sint32" "sint64" "fixed32" "fixed64"
      "sfixed32" "sfixed64" "string" "bytes" "bool" "float" "double")
    :test #'equal
    :documentation "These are the scalar types that may appear in protobufs.")
  
  ;;; .proto file parsing
  
  ;; Note: In May 2020 we switched from "schema" and "model" terminology to "descriptor" because
  ;; that's what other languages call the internal representation of a parsed .proto file. There may
  ;; be some references to the old terms that remain for a while.
  
  ;;; Parsing utilities
  
  (defvar *protobuf-package* nil
    "The package into which new symbols are interned during parsing, normally a package
     created by the protobuf 'package' statement.")
  
  ;; Why do services and methods use a different package?
  (defvar *protobuf-rpc-package* nil
    "The package into which new symbols are interned during parsing, for services and
     methods only.")
  
  (declaim (inline proto-whitespace-char-p))
  (defun proto-whitespace-char-p (ch)
  
negative.code:          (- (parse-integer (subseq string 3) :radix 16)))
          (t
           (read-from-string string))))
  