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

World: r3wp

[Core] Discuss core issues

Dockimbel
1-Apr-2008
[9955]
>> type? probe 1 = 0
false
== logic!
>> type?  probe first find [false true] 'false
false
== word!
[unknown: 5]
1-Apr-2008
[9956]
Fork the false is being returned because it is the last value.
Fork
1-Apr-2008
[9957]
>> (1 = 0) = (first find [false true] 'false)
== false
Dockimbel
1-Apr-2008
[9958]
in [false true], both are word! values, not logic!. If you want logic! 
values : logic! = first find reduce [false true] false
Fork
1-Apr-2008
[9959x3]
>> (1 = 0) = (first find reduce [false true] false)
== true
A ha
Is there a version of probe that prints the type also?
Dockimbel
1-Apr-2008
[9962]
Not by default, but here's one : probe*: func [value][probe :value 
probe type? :value :value]
Fork
1-Apr-2008
[9963x3]
Dockimbel: very useful!
>> if 'hedgehog [print "hedgehog"]
hedgehog
Oh my.  Well, I think I'd rather define a "safe" if that only accepts 
true/false if there isn't such a thing
Dockimbel
1-Apr-2008
[9966x2]
In REBOL everything is TRUE except false and none! values.
Btw, " favorite_fruit/set-value 'banana " doesn't look very rebolish 
to me...IMHO, REBOL way would be more like : " set-enum favorite_fruit 
'banana ". When you MAKE an object! in REBOL, all its functions are 
duplicated, so keeping the functions inside an object! and using 
it as in a class/instances model ends up eating a lot of memory. 
That's why the more "rebolish" way, where the code is out of the 
objects, is the way to go if you deal with a lot of instances (which 
might be the case for a "class" like enum!).  Remember that REBOL 
objects are prototype-based, meaning that they are created by cloning, 
not by instantiating a class. R3 will maybe bring us true class! 
datatype or at least a clean way to implement it by ourselves.
Geomol
1-Apr-2008
[9968]
To check, if false is the first element:


>> if head? find [false true] 'false [print "false is the first element"]
false is the first element

>> if head? find [true false] 'false [print "false is the first element"]
== none
Fork
1-Apr-2008
[9969x2]
Geomol: good point... that wasn't what I was doing, the quote should 
have been "false is in the list"  :)
Dockimbel: That's quite good to know, thank you, I will make that 
change.
Geomol
1-Apr-2008
[9971x2]
It was a quick ping-pong up there, so I'm not sure, if you know the 
answer, but to find false in a series:

>> if find [false true] 'false [print "false is in the list"]
false is in the list

And you know, this isn't the value FALSE, it's just words.
To check for the logic! value FALSE, you have to reduce the block:


>> if find reduce [false true] false [print "The logic! value false 
is in the series"]
The logic! value false is in the series

>> if find reduce ['false true] false [print "The logic! value false 
is in the series"]
== none
Fork
1-Apr-2008
[9973x3]
>> if ( reduce first find [false true] 'false ) [print "false is 
in the list"]
false is in the list
I'm looking for how to make first find [false true] 'false NOT print 
false is in the list
As per my usual question method, if y is ( reduce first find [false 
true] 'false )... what is f(y) to make that happen :)
Henrik
1-Apr-2008
[9976x2]
because FALSE there is a word!, not  logic!.
>> first find [false true] 'false
== false
>> type? reduce first find [false true] 'false
== word!
Fork
1-Apr-2008
[9978]
That much I get, I just thought that reduce turned false-as-word 
into false-as-logic and it does not
Geomol
1-Apr-2008
[9979]
Yes, it's still a word! and not a logic!, even if you reduce it.
Fork
1-Apr-2008
[9980]
So what turns it into a logic, if not reduce?
Dockimbel
1-Apr-2008
[9981]
do
Henrik
1-Apr-2008
[9982]
reduce the block instead
Fork
1-Apr-2008
[9983]
>> if ( do first find [false true] 'false ) [print "false is in the 
list"]
== none
Henrik
1-Apr-2008
[9984]
looks like R3 does not exhibit that behavior. it's reduced to logic!
Fork
1-Apr-2008
[9985]
Ok, great, that's the case I was worried about then...
Geomol
1-Apr-2008
[9986]
Or LOAD:
>> load to string! 'false
== false
Fork
1-Apr-2008
[9987]
I'm confused as to why reduce, which seems to perform other evaluations, 
would not (in R2) turn false into a logic!... Henrik, you are saying 
it does?
Henrik
1-Apr-2008
[9988]
Fork, Rebol 3 does, so this may be an inconsistency in Rebol 2.
Geomol
1-Apr-2008
[9989x2]
It's often works, if you turn stuff into a string and then load that. 
Other ways to turn stuff into strings:

>> load mold 'false
== false
>> load form 'false
== false
*It* often works ...
btiffin
1-Apr-2008
[9991]
Not quite;    reduce 'false  is a word,  reduces as a word!     reduce 
[false]   reduces the block, evaluating false to the logic! false. 
  It's fun stuff.   ;)    mold/all  can be your friend exploring 
the ins and outs of evaluated values.
Geomol
1-Apr-2008
[9992]
oops! :D
btiffin
1-Apr-2008
[9993]
Sorry John; responding to Forks confused post not yours.   I always 
trust Geomol advice  :)
Geomol
1-Apr-2008
[9994]
I got confused too. :)) REBOL is funny to play with!

>> type? load form 'false
== word!
>> type? load mold 'false
== word!
Dockimbel
1-Apr-2008
[9995]
In R2, REDUCE main purpose is to reduce block! values. For general 
evaluation use DO.
Geomol
1-Apr-2008
[9996]
btiffin, I make mistakes too! :-)
btiffin
1-Apr-2008
[9997]
Yeah any word! reduced is still the word!
Henrik
1-Apr-2008
[9998]
sorry:

>> type? false
== logic!
>> type? reduce false
== logic!

R2 and R3 behave identically here.
Geomol
1-Apr-2008
[9999]
Henrik, yes, but
>> type? reduce 'false
== word!

Is that the same in R3?
Fork
1-Apr-2008
[10000]
It seems like reduce is a core notion, and it would be nice to see 
a list mapping what conversions it performs.  Changing that between 
R2 and R3 seems rather... fundamental?
btiffin
1-Apr-2008
[10001]
Fork;   There are also "lexical forms" for all these values.   #[false] 
 is loaded by REBOL as the logic! value false.  No need to evaluate 
in that case.

John; yes.
Fork
1-Apr-2008
[10002]
I'd suggest coming up with a new keyword, e.g. reduce3, if something 
like that were to change.
Henrik
1-Apr-2008
[10003]
geomol, yes, they are identical
Geomol
1-Apr-2008
[10004]
Fork, we're normally ok with not being completely compatible with 
new versions. Better to correct the failures as soon as possible.