bearophile Wrote:
> Time ago I have suggested here (and in the Python newsgroup) to have
> automatically defined inside a function a standard name like __func__ that's
> an alias of the recursive function name it's contained into, this helps avoid
> stating the name of the function two or more times (as the this() constructor
> of D), this keeps the code a little DRYer, so renaming or moving around a
> recursive function gets a bit simpler and cleaner.
>
>
> Recursive functions have suggested me another little feature (that can not be
> added to Python because of its design) that I think I've not seen elsewhere.
> My recursive functions sometimes need to keep a bit of state, for example an
> integer that keeps the current "depth" of a tree structure that I'm creating
> or scanning, normally in D I can define the function like this:
>
> /// Always use depth=0 at the first call
> int foo1(int x, int depth=0) {
> ...
> foo1(x, depth + 1);
> ...
> }
>
> The last argument depth must be zero when the function is not called by
> itself, but I must rely on convention and code comments, because the program
> can't avoid errors like:
>
> void main() {
> foo1(10, 5);
> }
>
> To be sure to avoid that error I can create a callable struct that keeps
> depth as an attribute (code not tested):
>
> struct foo2 {
> int depth = 0;
> int opCall(int x) {
> ...
> }
> }
>
> This foo2 may even be a little faster because less data is passed to the
> function (callable struct) argument.
>
> But another possible solution is to have private default function arguments:
>
> int foo3(int x, private int depth=0) {
> ...
> foo3(x+1); // OK
> foo3(x, depth + 1); // OK
> ...
> }
> void main() {
> int r = foo3(5); // OK
> int r = foo3(5, 1); // Error
> int r = foo3(5, 0); // Error
> }
>
> Now the programmer is allowed to give/specify the "depth" argument only
> inside foo() itself :-)
> So the source code comment of foo1() is converted in foo3() into something
> that the compiler can enforce at compile-time.
>
> Bye,
> bearophile
Why not this?
void foo(int x)
{
void fooImpl(int x, int depth);
{
// ...
}
fooImpl(x, 0);
}