On 01/29/2014 01:39 AM, Brendan Zabarauskas wrote:
On 29 Jan 2014, at 9:15 am, Pierre Talbot <[email protected]> wrote:
I propose some requirements on function eligible for CTFE (see the proposal for
references to the Rust manual):
1. Its parameters are evaluable at compile-time.
2. It isn’t a diverging function.
3. It isn’t an unsafe function.
4. It doesn’t contain unsafe block.
5. It doesn’t perform I/O actions.
6. The function source code is available to the compiler. It mustn’t be in an
external
block, however it can be an extern function.
This sounds very much like D’s `pure` keyword.
http://dlang.org/function.html#pure-functions
From the website:
Pure Functions
--------------
Pure functions are functions which cannot access global or static, mutable
state save through their arguments. This can enable optimizations based on the
fact that a pure function is guaranteed to mutate nothing which isn't passed to
it, and in cases where the compiler can guarantee that a pure function cannot
alter its arguments, it can enable full, functional purity (i.e. the guarantee
that the function will always return the same result for the same arguments).
To that end, a pure function:
- does not read or write any global or static mutable state
- cannot call functions that are not pure
- can override an impure function, but an impure function cannot override a
pure one
- is covariant with an impure function
- cannot perform I/O
As a concession to practicality, a pure function can:
- allocate memory via a NewExpression
- terminate the program
- read and write the floating point exception flags
- read and write the floating point mode flags, as long as those flags are
restored to their initial state upon function entry
- perform impure operations in statements that are in a ConditionalStatement
controlled by a DebugCondition.
A pure function can throw exceptions.
CTFE would be extremely welcome for improving Rust’s compile time code
generation capabilities. This is important both practically and also for
closing the gap between us and D or C++. It could allow, for example, numeric
operators to be overloaded in the std whilst still being able to be used at
compile time. Casts could also be implemented in-library. I’m sure there are
even better examples though.
~Brendan
Hi,
From my proposal:
2.3 Relation with pure function
A pure function is a function that is free of side-effects, you can call
a pure function any
number of time with the same set of inputs and be sure the results will
be identical.
An observation is that if a function meets the requirements of CTFE it
must be a pure
function, but a pure function doesn’t necessarily meet the requirements
of CTFE. It
mostly depends on the language, for example, in Rust, a pure function
can contain
unsafe blocks but the CTFE requirements doesn’t allow that.
I add: a pure function can call extern code and diverges, so the pure
requirements are a subset of the CTFE requirements.
Pierre
_______________________________________________
Rust-dev mailing list
[email protected]
https://mail.mozilla.org/listinfo/rust-dev