On Monday, January 2, 2017 at 8:26:52 AM UTC-6, Bram Moolenaar wrote: > Brett Stahlman wrote: > > > On Saturday, December 31, 2016 at 12:23:10 PM UTC-6, ZyX wrote: > > > 2016-12-30 20:09 GMT+03:00 Brett Stahlman <brettstahl...@gmail.com>: > > > > Consider the following recursive user function... > > > > > > > > fu! Fun(count) > > > > if a:count > 0 > > > > call Fun(a:count - 1) > > > > endif > > > > endfu > > > > > > > > :h 'maxfuncdepth' describes the option's purpose as follows: > > > > > > > > Maximum depth of function calls for user functions. This normally > > > > catches endless recursion. When using a recursive function with > > > > more depth, set 'maxfuncdepth' to a bigger number. > > > > > > > > So I would expect to be able to make the following recursive call with > > > > no error: > > > > :set maxfuncdepth=1000 > > > > :call Fun(500) > > > > > > > > But I get the following error after slightly less than 200 recursive > > > > calls: > > > > E169: Command too recursive > > > > > > > > The documentation for E169 states the following: > > > > > > > > This happens when an Ex command executes an Ex command that executes an > > > > Ex > > > > command, etc. This is only allowed 200 times. When it's more there > > > > probably > > > > is an endless loop. Probably a |:execute| or |:source| command is > > > > involved. > > > > > > > > It's as though the :call (Ex command) is triggering the error long > > > > before the number of calls to the user function Fun() has reached > > > > 'maxfuncdepth'. But if this is the way it's supposed to work, what's > > > > the point of 'maxfuncdepth'? Don't all calls to user functions involve > > > > an Ex command (since both `call' and `let' are Ex commands)? Is there > > > > a way to permit more than 200 recursive calls to Fun() without > > > > triggering the error? > > > > > > I tried lambdas, but they also catch this error due to the way they > > > are implemented. Unlike (until you consider their internal > > > implementation) lambdas regular functions are lists of Ex commands, so > > > this is not surprising. Note that by default &maxfuncdepth is 100 > > > which is lesser then 200. > > > > Hmm... Perhaps Bram will weigh in on this, but effectively limiting > > 'maxfuncdepth' to 200 feels like an unintended consequence, rather than > > design intent - especially since the help on 'maxfuncdepth' makes no > > mention of the limit. The documentation on E169 suggests that the purpose > > of the 200 limit is to detect certain types of recursion involving :source > > and :execute commands. If it was meant to apply to function calls > > generally, why even have a separate option for function calls, especially > > if you can't increase its value to something that would permit meaningful > > recursion? > > > > Since there's no option governing the E169 limit, perhaps it could be > > changed to the maximum of 200 and 'maxfuncdepth'. Or perhaps it could take > > into account the type of Ex command (i.e., source/execute vs call/let). Or > > perhaps there could be a 'maxmemfunc' option (analogous to > > 'maxmempattern'), which would limit function call recursion by stack space > > consumed (or some rough approximation thereof) rather than # of calls. > > > > I noticed this because I'm running a tree processing algorithm that is > > inherently recursive. I had intended to compute 'maxfuncdepth' as a > > function of another option, but discovered that my choice was silently > > ignored for anything over 200. Although the depth of the trees can exceed > > 200 in extreme cases, the depth is bounded and known, so it made sense > > simply to boost 'maxfuncdepth' long enough to recurse the tree. If there's > > no way around the 200 maximum, I'll probably have to rewrite the algorithm > > to use breadth-first traversals, rather than the much more natural (and > > simple) tree recursion. > > I think that we can also used 'maxfuncdepth' for the Ex command > recursion. They have similar functionality, even though the semantics > are a bit different. It's not worth adding another option for this. > > So you can set 'maxfuncdepth' to 1000 and have a call depth of 1000, > minus any other Ex commands that are involved, such as :execute.
Sounds great! Thanks, Brett Stahlman > > -- > hundred-and-one symptoms of being an internet addict: > 172. You join listservers just for the extra e-mail. > > /// Bram Moolenaar -- b...@moolenaar.net -- http://www.Moolenaar.net \\\ > /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ > \\\ an exciting new programming language -- http://www.Zimbu.org /// > \\\ help me help AIDS victims -- http://ICCF-Holland.org /// -- -- You received this message from the "vim_use" maillist. Do not top-post! Type your reply below the text you are replying to. For more information, visit http://www.vim.org/maillist.php --- You received this message because you are subscribed to the Google Groups "vim_use" group. To unsubscribe from this group and stop receiving emails from it, send an email to vim_use+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.