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

World: r3wp

[!REBOL3]

Ladislav
2-Aug-2010
[4175x2]
>> g: func [/local x [any-type!]] [value? 'x]
>> g
== true
>> g/local
== false
(R2 example too)
Maxim
2-Aug-2010
[4177x2]
but the use of  any-type! is what specifically allows this "trick".

R3 removed the ability to not supply arguments...

>> a: func [x [any-type!]][value? 'x]
>> a
** Script error: a is missing its x argument
IIRC this was the great "equalizer" when make was overhauled... it 
now always accepts exactly one argument, because it is forced to.
Gregg
2-Aug-2010
[4179]
R2's behavior has always worked well for me. Unset is the special 
case I avoid unless I really, REALLY think there's a need to leverage 
it. I very rarely use any-type! for that reason. I like declared 
locals being NONE. I can't think of a time I tripped over using a 
refinement without passing its arg, but there unset would have to 
be intentionally expected as well.
Ladislav
2-Aug-2010
[4180x3]
>> b: func ['x [any-type!]][value? 'x]
>> b
== false
(R3)
Well, anyway, because of this, RebolTutorial completely ignoring 
any explanation makes a bad publicity to Rebol stating that "FUNCT 
and FUNC are incompatible", which is just nonsense.
Maxim
2-Aug-2010
[4183]
ok, but that is a fringe case which probably got put there specifically 
to allow that specific pattern so that some command-line functions 
can be simplied... 
its not the intended use of Rebol.


argument passing by reference is rarely used (a few mezzanines and 
highly specialized situations)
Gregg
2-Aug-2010
[4184]
Agreed. And things like the R3 behavior for a missing arg when using 
a lit-word! param versus a word! param would be good to note in the 
FUNC docs.
Maxim
2-Aug-2010
[4185x2]
in the above cases, they should be unset, because in fact they are 
passed unset!
the 'x refers to no value
Gregg
2-Aug-2010
[4187]
I think Ladislav dislikes lit-word params anyway, as they are a pain 
when generating code, but they make for good examples and thought 
experiments.
Maxim
2-Aug-2010
[4188]
they are mainly used for command-lines and code analysis funcs (?? 
for example)
Ladislav
2-Aug-2010
[4189]
Explanation: the "partially evaluated arguments" as used in R3 are 
OK with me, I disliked their R2 counterparts.
Gregg
2-Aug-2010
[4190]
OK. :-)
Maxim
2-Aug-2010
[4191x2]
yes, I agree completely.  this is now an intended setup, not an interpreter 
loophole leveraged as a feature.
Lad, can you explain simply, what is the difference between func 
and funct which RebolTutorial claims?
Ladislav
2-Aug-2010
[4193]
I cannot, because there is none
Maxim
2-Aug-2010
[4194]
ok
Ladislav
2-Aug-2010
[4195x2]
Example:
>> f: funct [] [[x:] value? 'x]
>> f
== true
Maxim
2-Aug-2010
[4197]
but I meant what does HE claim is the difference?
Ladislav
2-Aug-2010
[4198x3]
RebolTutorial claims, that the behaviour of the above F differes 
from FUNC, which is just nonsense, since the SOURCE function tells 
us:
>> source f
f: make function! [[
    /local x
][[x:] value? 'x]]
I do not think it deserves any more comments
Maxim
2-Aug-2010
[4201]
yeah, he doesn't seem to grasp that there is just one function! type 
 ;-)

and there is that nice little line in funct :   collect-words/deep/set/ignore

which pretty much explains it all  :-)
Ladislav
2-Aug-2010
[4202x6]
Nevertheless, the whole issue is related to his misunderstanding 
how the values of "unused refinement arguments" are set in functions
And, in my opinion, this actually *is* a gotcha for beginners
Since HELP tells us what the VALUE? function is supposed to do, which 
just does not look like being the case above
Reading the HELP string of the VALUE? function, I do not know, how 
I can reasonably expect F to yield #[true]
(which does not mean I don't respect Max's feelings on this)
The funny thing is, that the COLLECT-WORDS/IGNORE looks like being 
Tutorial's strategy when communicating with me ;-)
Maxim
2-Aug-2010
[4208x4]
/local x  sets the value of x to none in the F above.
if F was defined like so instead (R2)

>> f: make function! [/local x [any-type!]][[x:] value? 'x]


then you can call it with with unspecified /local arguments and it 
will yield #[false]

>> f/local
== false
things is funct doesn't add that [any-type!] in its param block.
(for locals)
so yes... the value?  help string makes sense... its defined as a 
local within the function, as 'FUNCT is supposed to do automatically.
Ladislav
2-Aug-2010
[4212]
defined as a local

 - yes, that is true, but in my example below, 'x is clearly defined 
 as "nonlocal", yet the function yields #[false], in accordance with 
 its help string:

>> g: func [] [[x:] value? 'x]
>> g
== false
BrianH
2-Aug-2010
[4213]
A little note about FUNCT vs. FUNCTOR: The word "functor" has a specific 
meaning in computer science, and that meaning is *not* what FUNCT 
does. There is no standard CS term for what FUNCT does, nor is there 
a standard English term. Any word we use would therefore have to 
be made up. FUNCT is not a bad made-up word: it's short, which is 
good for a function that will be used often in user code, and it 
starts with the same letters as FUNC and FUNCTION without being either 
one of those words.
Maxim
2-Aug-2010
[4214]
I'd rather we use PROC then.
Andreas
2-Aug-2010
[4215]
I strongly agree with Brian regarding the unsuitability of FUNCTOR.
Ladislav
2-Aug-2010
[4216]
Yes, I do agree too
Maxim
2-Aug-2010
[4217]
actually Lad, if a word is defined but stores a value of unset!  
(like what happens above with the [x:]  value? returns false.
BrianH
2-Aug-2010
[4218]
Some counterexamples where we messed this up:

- "functions" have side effects so they aren't really functions, 
they are procedures with return values.

- "closures" aren't really closures, though they are closer to that 
than REBOL "functions" are.
- "contexts" aren't contextual
The list goes on.
Maxim
2-Aug-2010
[4219x2]
cause x actually has not ever been set.
so if I get you right,  in REBOL: 

contexts are actually closures, 
functs are actually functions 
and funcs are actually procedures

;-)
BrianH
2-Aug-2010
[4221]
We actually had a function called FUNCTOR for a while, and it really 
created functors. And it went unused for more than a year, so we 
dropped it. It turned out that what FUNCT does is really useful, 
even though the concept is unique to REBOL. Apparently functors aren't.
Ladislav
2-Aug-2010
[4222]
Brian, agreed, but e.g. "functions" are somewhat "standard" (C, ...)
BrianH
2-Aug-2010
[4223x2]
FUNCTs and FUNCs are both procedure builders. Neither create functions. 
It's a common naming mistake in imperative languages.
Including C and the Pascal it was based on.