Completely agree.  People think I&#x27;m weird that I think functions being first-class is a dumb idea.<p>But think about it: how often do you need to perform some complicated algorithm on a function, or store a dynamically generated function in a data structure?  Almost always, first-class functions are simply used as a means of genericizing or parameterizing code.  (e.g. as arguments to `map` or `fold`, or currying.)  (Languages like Haskell and Coq that are deeply rooted in the lambda calculus are a notable exception to this; it&#x27;s common to play interesting games with functions in these languages.)<p>You can get the same capabilities by making functions <i>second-class</i> objects, with a suitable simple (non-Turing-complete) language with which to manipulate them.  That language can even be a subset of the language for first-class objects: the programmer is none-the-wiser unless he&#x2F;she tries to do something &quot;odd&quot; with a function outside the bounds of its restricted language.  Generally, there is a clearer, more efficient way to express whatever it is they are trying to do.<p>There is some precedent for this.  In Haskell, typeclass parameters live alongside normal parameters, but aren&#x27;t permitted to be used in normal value expressions.  In OCaml, modules live a separate second-class life but can be manipulated in module expressions alongside normal code.  In Coq, type expressions can be passed as arguments, but live at a different strata and have certain restrictions placed on them.<p>Unfortunately designing languages like this is <i>hard</i>.  It&#x27;s easy to just say &quot;well, functions are a kind of value in the interpreter I just wrote; let&#x27;s make them a kind of value in the language&quot;.  This is the thinking behind highly dynamic languages like JavaScript, Python, and Elixir: the language is modeled after what is easy to do in the interpreter without further restriction.  The end result is a language that is difficult to optimize and analyze.<p>It&#x27;s a lot more work to plan out &quot;well, I ought to stratify modules, types, functions, heterogenous compounds, homogeneous componds, and scalars, because it will permit optimizations someday&quot;.  But these are the languages that move entire industries.