r3wp [groups: 83 posts: 189283]
  • Home
  • Script library
  • AltME Archive
  • Mailing list
  • Articles Index
  • Site search
 

World: r3wp

[!REBOL3 Proposals] For discussion of feature proposals

Maxim
11-Nov-2010
[226]
with the above example, I'm thinking about the past discussions and 
they are starting to make sense in a new light  :-)
BrianH
11-Nov-2010
[227]
I have discussed a new page organization strategy for the Exceptions 
page with Ladislav. As time permits, I will try to reorganize. It 
will make these issues much more clear.
Ladislav
11-Nov-2010
[228]
Max, the errors page you mentioned tried to illustrate the difference 
between dynamic and definitional return, which looks more subtle, 
than the difference between dynamic and definitional variables...
BrianH
11-Nov-2010
[229x2]
its just less complicated to build mezz code with dynamic returns

 - Depends on the code. Some obscure but important things are impossible 
 if you have dynamic returns. Some less-obscure things aren't even 
 defined as a concept if your returns are definitional..
The reason we can get rid of dynamic returns in R3 is because the 
critical stuff that we used to do with dynamic returns in R2 is *necessarily* 
handled by dynamic breaks in R3, so dynamic returns are no big loss.
Ladislav
11-Nov-2010
[231]
A description of the difference between the definitional and dynamic 
return:


*the dynamic return returns to the dynamically closest function (i.e. 
to the function that was called as the last one)

*the definitional return returns to the definitionally closest function 
(i.e. to the function that was defined as the last one and contained 
the return in question)
BrianH
11-Nov-2010
[232]
That's not all. Definitional also requires the affected functions 
to have (and in some cases fake) lexical scope. For R3 this means 
nested blocks.
Maxim
11-Nov-2010
[233]
lad,  what I mean is that the illustration of the variable issues 
above helps us realize that there even *is* a dynamic vs definitional 
distinction. 
it then allows us to more fully understand the return issues. 


you might be surprised that I never even realized there where dynamic 
variables, in the way you present it above.  Even if I've grown to 
understand binding pretty deeply.
Ladislav
11-Nov-2010
[234]
aha, OK
Maxim
11-Nov-2010
[235]
in a sense... you can say that I might even begin to understand your 
guru code now  ;-)
Ladislav
11-Nov-2010
[236]
that is you who should say that ;-)
Maxim
11-Nov-2010
[237]
hehe
BrianH
11-Nov-2010
[238]
Fortunately, functions are built with nested blocks, though that 
is partly enhanced in R3 by tasking issues. And while loops are also 
build with nested blocks, BREAK also applies to PARSE, which relies 
on dynamic scope (and yes, I can point you to mathematical proofs 
of this, though there's no point), so we still need dynamic BREAK. 
Dynamic THROW is just a good idea because of all the capabilities 
that would give us.
Ladislav
11-Nov-2010
[239]
but, nevertheless, there isn't any reasonable defnition of dynamic 
versus definitional concepts in the article, so I take that as a 
hint
BrianH
11-Nov-2010
[240x2]
Absolutely right, Ladislav. There needs to be such a definition, 
or at least a comparison. I was going to add one.
Not to your page of course :)
Ladislav
11-Nov-2010
[242]
Probably an example (or two) is preferable
BrianH
11-Nov-2010
[243]
This would be part of the issues section, so it would be mostly prose. 
This is part of a strategy to remove most of the prose from the other 
sections, so there will be more room for examples.
Maxim
11-Nov-2010
[244]
btw, the dynamic variable, just solved a long standing binding problem 
riddle I had with classed based instantiation of objects in R2.  
when I had talked to Carl about it at the last devcon, even he couldn't 
explain it... so its a very nice thing to get "out in the open".
Andreas
11-Nov-2010
[245]
With parse being a dialect on it's own, BREAK in PARSE can be separate 
from BREAK in loops. So that's not really an argument to keep dynamic 
BREAK (for loops).
BrianH
11-Nov-2010
[246x3]
That way the issues can be laid out clearly, so the rest of the page 
can just link to the appropriate issues sections instead of repeating 
things.
PARSE doesn't bind the code in its parens - that's regular REBOL. 
Parse also can't know ahead of time which blocks it will be treating 
as rules, because it uses dynamic scope for the whole dialect.
Definitional returns or escapes rely on lexical scope. If you don't 
have lexical scope, you don't have the ability to do definitional. 
So what PARSE needs is for the top-level BREAK to be dynamic. And 
if one level is dynamic, we are better off with all levels being 
dynamic, at least for the same escape function. Same goes for definitional.
Andreas
11-Nov-2010
[249]
Thanks for restating the facts. Once again, there's nothing intrinsic 
in PARSE that forces it to use the same BREAK used in loops.
BrianH
11-Nov-2010
[250]
Yes there is: Definitional breaks redefine BREAK to a definitional 
function, and PARSE relies on BREAK being dynamic because PARSE is 
inherently and necessarily dynamic and doesn't rebind anything in 
the parens, nor should it. For that matter, PARSE rules can be reassigned 
in their productions, so PARSE can't even rely on the rules being 
the same thing the next time round.
Maxim
11-Nov-2010
[251]
note that there are two usable BREAKs in parse.    parse [break] 
  vs   parse [(break)]
Andreas
11-Nov-2010
[252]
Use LEAVE-PARSE instead of BREAK for exiting PARSE.
BrianH
11-Nov-2010
[253]
Maxim, there is also parse [return].
Andreas
11-Nov-2010
[254]
See also the change log notes for A98, where the BREAK handling was 
actually introduced:
http://www.rebol.com/r3/changes.html#section-23
BrianH
11-Nov-2010
[255]
Which is not the same as PARSE [(return)], but PARSE doesn't pay 
attention to the bindings of the keywords in its rules, just those 
of the rule names. And in the productions (parens) PARSE can't do 
any rebinding at all because it can't assume that BREAK is referring 
to the same function.
Andreas
11-Nov-2010
[256x3]
Point is: the behaviour of BREAK in PARSE is not a strong argument 
at all when considering the behaviour of BREAK in loops.
BREAK in PARSE was added as a nice hack, but it certainly is not 
the primary functionality of BREAK.
If it makes sense to change the behaviour regarding the primary functionality 
of BREAK, this cute little hack is the least thing that should stand 
in the way of that change.
BrianH
11-Nov-2010
[259]
The behavior of BREAK in PARSE is the main reason we can get away 
with dropping dynamic return. It's a tradeoff - you get dynamic break 
or dynamic return.
Andreas
11-Nov-2010
[260x2]
Because we can not use dynamic THROW in PARSE, or what?
Dynamic break is completely irrelevant in the context of parse.
BrianH
11-Nov-2010
[262]
Ladislav wants to get rid of dynamic throw as well.
Andreas
11-Nov-2010
[263]
Yes, but that's one argument, not two.
BrianH
11-Nov-2010
[264x2]
It is becoming abundantly clear that there is more and more need 
for a comparison section that shows the strengths of dynamic vs. 
definitional, because people seem to not understand that there are 
ceratin classes of code and algorithms (parsing, for instance) that 
can't be expressed with strict lexical scoping. You are giving up 
a lot when you go definitional, so that better stuff not be as important 
in the context where you do it.
better stuff not be as important -> stuff better not be as important
Andreas
11-Nov-2010
[266x2]
One construct for dynamic scoping is sufficient.
Would we have a WITH-DYNAMIC we wouldn't need anything else.
BrianH
11-Nov-2010
[268x2]
It turns out that with functions, because of the tasking issues, 
you already have to give up the benefits of dynamic return. So getting 
rid of dynamic return is no loss. The same can't be said of BREAK.
It is only because of tasking issues though - otherwise losing dynamic 
return would be a big deal.
Andreas
11-Nov-2010
[270]
To you, personally.
BrianH
11-Nov-2010
[271]
There are some advantages to definitional return as well, so it's 
a net plus.
Andreas
11-Nov-2010
[272]
As should be obvious by now, there are varying views on that issue.
BrianH
11-Nov-2010
[273x3]
Yes, based on varying levels of information. My statement is objective. 
It is all a tradeoff, and I have not at any point tried to hide the 
upsides and downsides of both approaches.
I can assert stuff about PARSE because Peta was nice enough to include 
or link to the mathematical proofs on the Parse Proposals page.
So I can say that PARSE is based on dynamic scope with certainty.