It really frustrates me that we somehow collectively decided type-level metaprogramming and codegen were "magic" and too confusing, but late-binding, dynamic dispatch, ad-hoc polymorphism, and a whole bunch of other stuff were totally normal and fine
@sliminality @samth I think there are two contributing factors:
(a) lots of intro CS curriculum has built up intuitively pleasing metaphors for polymorphism
(b) it’s easier to build “partly working” code when failures happen at runtime than compile time, which feels easier/more productive because humans are bad at evaluating future reward/punishment