Hy metadata proposal
Clojure has a metadata system that applies an arbitrary map to symbols and its built in collection types (i.e. the kind code is made of). This is used for, among other things, type hints.
The ^ reader macro (formerly #^), applied to a mapping, followed by a compatible object (symbol or coll) attaches that mapping to the object as metadata. E.g. ^{:spam "eggs"} foo attaches the metadata mapping {:spam "eggs"} to the symbol object foo.
There are shortcuts. Applying ^ to a keyword adds it as a flag, e.g. ^:spam foo is the same as ^{:spam true} foo. Applying ^ to a string adds it under the :tag key, e.g. ^"spam" foo is the same as ^{:tag "spam"} foo.
You can also attach metadata more than once. E.g. ^:x ^:y foo is the same as ^{:x true, :y true} foo i.e. the mappings are merged. Clojure mappings are immutable, so it returns a new symbol with different metadata.
Clojure metadata does not impact equality. The symbol foo is equal to the symbol foo with metadata attached. But they are different objects.
In Hy, I propose adding metadata to all Hy model objects. These would usually be unavailable at runtime, since the compiler discards the model objects after translating them to Python AST. But macros could use them, and so could the compiler. The line/column number we use for the debugger and stack trace would then be metadata.
And we'd also use them for function and variable annotations. Anything under :tag would end up compiled in the AST and thereby __annotations__. We could generalize the shortcut so that not just strings, but anything besides a mapping or a keyword gets put under :tag.