[fpc-devel] Pure function development

J. Gareth Moreton gareth at moreton-family.com
Wed Apr 29 23:59:19 CEST 2020

I'm glad we agree that one benefit of pure functions is loop-hoisting.  
I call them pure functions because that's the technical name for them: 
https://en.wikipedia.org/wiki/Pure_function - they're analogous to a 
mathematical function.  'Read-only' sounds a little ambiguous to me and 
not immediately certain as to what is actually read-only. Granted, the 
meaning of 'pure' doesn't immediately jump out either, but the lack of 
side-effects and consistent outputs for a given inputs are the necessary 
criteria to be defined as such.

The "pure" directive, or the lack of it in most functions, helps takes 
pressure off the compiler, while its presence aids the programmer by 
explicitly stating that 'this function is pure' and can be used as 
such.  If a third-party library removes the purity of a function 
compared to an earlier version, I would put the blame on the programmer 
of the library rather than the language itself.  There will always be 
cases where you've screwed yourself over and have to change things, like 
the addition of a new parameter in a subroutine.

I suppose node emulation would be equivalent to constant propagation.  I 
sense we might need to refactor things afterwards so the same code can 
be reused for both purposes.  My current design for the emulation would 
introduce a new virtual method for TNode that descendants override to 
perform their specific behaviour, rather than have it all in a 
monolithic 'propagate' procedure.  By default, this method would return 
a 'fail' code to indicate the function is not pure (a function that is 
marked as 'pure' but is discovered not to be will raise a compiler 
warning, and an error if it's part of a constant assignment), so you 
don't have to program something for every single node and the 
introduction of a new node type won't break the emulator.

I think the difference between constant propagation and node emulation 
in this regard is that the former is trying to simplify nodes and 
eliminate conditional branches that will not be executed, among other 
things, while the latter is trying to generate a single output (or 
multiple if the routine has "out" parameters).

Gareth aka. Kit

This email has been checked for viruses by Avast antivirus software.

More information about the fpc-devel mailing list