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); }