In reading over the Debugging draft (i.e., the future S20), I ran
across the concept of the infectious trait - that is, a trait that
doesn't just get applied to the thing to which it is explicitly
applied; rather, it tends to spread to whatever else that thing comes
in contact with. "Taint" is the primary example of this, although not
the only one.
In reading about functional programming, I ran across the concept of
the "pure function" - i.e., a function that doesn't produce side
effects. The article went on to say that "While most compilers for
imperative programming languages detect pure functions, and perform
common-subexpression elimination for pure function calls, they cannot
always do this for pre-compiled libraries, which generally do not
expose this information, thus preventing optimisations that involve
those external functions. Some compilers, such as gcc, add extra
keywords for a programmer to explicitly mark external functions as
pure, to enable such optimisations."
It occurred to me that this business of marking functions as pure
could be done in perl by means of traits - that is, any function might
be defined as "is pure", promising the compiler that said function is
subject to pure function optimization. It further occurred to me that
a variation of the contagious trait concept (operating on code blocks
and their component statements instead of objects; operating at
compile time rather than run time; and spreading via "all
participants" rather than "any participant") could be used to auto-tag
new pure functions, provided that all so-called "primitive pure
functions" are properly tagged to begin with. The compiler could then
rely on this tagging to perform appropriate optimization.
Such auto-tagging strikes me as being in keeping with Perl's virtue of
laziness: writers of new code don't have to care about tagging pure
functions (or even know that they exist) in order for the tagging to
take place, leading to a potentially more robust library of functions
overall (in the sense of "everything in the library is properly
annotated"). As well, I could see it having some additional benefits,
such as in concurrent programming: "is critical" could be similarly
infectious, in that any function that might call a critical code block
should itself be tagged as critical. Indeed, "is critical" and "is
pure" seem to be mutually exclusive concepts: a given code block might
be critical, pure, or neither; but it should never be both.
Am I onto something, or is this meaningless drivel?
Jonathan "Dataweaver" Lang