Infer purity of functions too?
Jonathan M Davis
jmdavisProg at gmx.com
Mon Jul 18 16:43:44 PDT 2011
On 2011-07-18 16:02, Johann MacDonagh wrote:
> On 7/18/2011 7:00 PM, bearophile wrote:
> > Jonathan M Davis:
> >> And if pure were inferred for a function and then it became
> >> impure, that could break a _lot_ of code.
> >
> > OK. The restricted idea then is to infer only the purity of functions
> > called by templates, to allow more templates to be pure, and such
> > inferred purity is seen by function templates only.
> >
> > Example: if a not pure function sqr is called by both a not pure template
> > bar and by a pure function foo, the compiler raises an error in foo,
> > because sqr is not pure, but compiles the pure main because sqr called
> > by bar is seen as pure :-)
> >
> >
> > int sqr(in int x) {
> >
> > return x * x;
> >
> > }
> > int foo(in int x) pure { // error, sqr is not tagged pure
> >
> > return sqr(x) + sqr(x);
> >
> > }
> > int bar(T)(in T x) {
> >
> > return sqr(x) * sqr(x);
> >
> > }
> > void main() pure {
> >
> > bar(1); // OK, sqr can be inferred as pure
> >
> > }
> >
> >
> > It looks a bit complex :-)
> >
> > Bye,
> > bearophile
>
> I thought purity inference only worked one level deep. It would look at
> each of the functions it calls. If they are all explicitly marked pure,
> then its pure. I don't believe it analyzes the body of sqr to mark it as
> pure. You'd still have to mark sqr as pure.
I'm not sure how deep it currnently goes, but it definitely _should_ go as
deep as the templates go. If it calls an templated functions, then those
functions have to be generated before it can use them anyway - let alone know
whether they're pure or not. So, if you have 10 levels of 10 template function
calls with a normal pure function at the bottom (or a template function at the
bottom which doesn't call any other functions and doesn't do anything that a
pure function can't do), then all 10 levels should be pure. Whether that works
at the moment, I don't know. But if it's only one level, then purity inference
doesn't gain us much given how often templated functions call other templated
functions.
- Jonathan M Davis
More information about the Digitalmars-d-learn
mailing list