> You'd want "EXTRAS = null" after each MULTIPLE-VALUE-BIND as well, but > maybe you get this for free since the function call in a > MULTIPLE-VALUE-BIND is by definition not a tail call. > > We can summarize this proposal similarly to the other one: > > 1. Pass multiple values using a global variable > 2. Instrument every non-tail call. > > It may still be too naive but it at least fixes the examples that > broke GV earlier in the thread. So, is there an example that works in > foo.mv but fails in GV as described above?
I see a problem in that you'd have to instrument not just return statments, but any kind of control flow that goes up the stack - so you'd have to put the suppression code at the end of every function definition, and also wrap throws. So this wouldn't work if you call a JS function expecting multiple values, and that JS function happens to call a PS function that wants to return multiple values. > p.s. I also wonder if the recursion difficulty disappears now that we > understand passthrough better. The example was: > > (defun foo (x) > (if (= x 1) > (values 1 2) > (1+ (foo (1- x))))) > > In both the GV and foo.mv designs, shouldn't foo(2) do the right thing > now? That recursion is a non-tail call, so GV would suppress MV > passthrough and foo.mv wouldn't enable it. You're right. Good point. Vladimir _______________________________________________ parenscript-devel mailing list [email protected] http://lists.common-lisp.net/cgi-bin/mailman/listinfo/parenscript-devel
