(defn emit-hinted [local tag env]
(let [tag (or tag (-> local meta :tag))
init (list (get env local))]
(if-let [prim-fn (case (cond-> tag (string? tag) symbol)
int `int
long `long
char `char
float `float
double `double
byte `byte
short `short
boolean `boolean
nil)]
[(vary-meta local dissoc :tag) (list prim-fn init)]
[(vary-meta local merge (when tag {:tag tag})) init])))