On Monday, April 29, 2013 12:58:44 monarch_dodra wrote: > Is there *any* way to make a call to a non-pure function in a > pure context, if you know you won't violate your own purity? > > This is something you can do with @safe (@trusted), but what > about pure? > > For example, "free" is not pure, because you can't call it twice > on the same pointer. But if you manage the pointer yourself > inside a struct, you can guarantee the purity of your own > functions. But the language won't allow you to do that.
You can cast a pointer to the function. std.datetime does that for the LocalTime and UTC singletons. Take a look at the semi-recently added std.traits.SetFunctionAttributes. > Related question: > Can a function that "sometimes throws" be considered as pure? Throwing has nothing to do with purity. pure is purely a question of whether the function accesses module-level or static variables which can possibly be mutated after they're initialized. Strong purity (which is required for most/all optimizations) is then places additional requirements on the function parameters, but purity itself is simply a question of whether the function accesses module-level or static variables. So, throwing has nothing to do with it. - Jonathan M Davis