Follow up See here. Update: I was wrong and Rich Hickey set me right: I didn’t measure the gains I’m expecting because the inline-expanded form still go through the var lookup. See here (or the comments) for real gains (around 800ms on my laptop). This is a quick and dirty hack to emulate primitive types support for globally-bound fns: (defmacro defhintedfn [name args & body] (let [iface (gensym "