You cannot pass in a list as meta, but you can pass in a map like I showed. If you pass in the list form unquoted, it will be eval’d at read-time (in this instance), and yield a result of Boolean, since Boolean is bound to java.lag.Boolean, and is truthy, which will return a result for or.
(binding [*print-meta* true]
(pprint (let [x (with-meta (gensym "x") {:type '(or Boolean (and Number (not Long)))})]
`[~x])))
[^{:type ^{:line 4925, :column 53}
(or Boolean
^{:line 4925, :column 65}
(and Number
^{:line 4925, :column 77} (not Long)))} x21123]
Another option is to encode with vectors, or maps even.
(binding [*print-meta* true]
(pprint (let [x (with-meta (gensym "x") {:type '[or Boolean [and Number [not Long]]]})]
`[~x])))
[^{:type [or Boolean [and Number [not Long]]]} x21118]