Need to be able to specialize generated functions and expressions based on an arbitrary set of data
i.e. 2D vs 3D, which domains to evaluate
Should be hierarchical
i.e. Global spec gets passed in during evaluation (i.e. interpretation, codegen),
and can be overridden on a case-by-case basis when composing child functions
Allows things like changing between vector spaces from within a function
Need to account for specialization in Identifier use cases
Specialization data needs to be uniquely identifiable (hashable?), and that uniqueness needs to propagate to generated function identifiers to avoid ex. point_2d_distance_gradient and point_3d_gradient from both coming through as point and getting deduplicated incorrectly
Needs to be compatible with static function generation