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

World: r3wp

[Core] Discuss core issues

Ladislav
26-Jul-2011
[1957x2]
I think, that the point here is the Geomol's question:


I still ask myself, if all those constructs are really necessary 
taking the amount of work and time used into account.


The answer is quite simple, it is as with any data the Load dialect 
can represent:


- many data representable by the Load dialect aren't "really necessary"

-- other languages can usually represent less data types than the 
Load dialect can

-- the Load dialect did not have the escaped format from the start, 
and could do without it


- without the escaped format, the Load dialect cannot express values 
of the logic! type


- it is useful to be able to express values of the logic! type in 
the Load dialect
-- some languages have the advantage of being able to do that

-- it is confusing to use a word like true in the Load dialect, when 
meaning the logic value, since in the Load dialect true is a word, 
not a logic value (notice the example, where Geomol confused words 
and their values)

-- the expressibility of the logic! datatype in the Load dialect 
enhances the expressivity of the dialect, which is why it is useful 
to have it, similarly as for any other datatype expressible

-- the expressibility of the logic! datatype enhances the reflexivity 
of REBOL, since 

--- this way, the Load dialect can express values that would be otherwise 
inexpressible in it, while being used in the Do dialect

--- that means, that the Load dialect would not be usable to "speak 
about" logic values in a direct way
That was my answer as far as the usefulness of the #[true] and #[false] 
values is taken into account. Similarly, the usefulness of #[unset!] 
and #[none] is quite unquestionable. As far as the usefulness of 
the other representaions goes, it may be more questionable to have:

- escaped format for objects, because

-- some objects are not describable precisely enough using the current 
escaped format

-- nevertheless, the ability to describe a result of a REBOL expression 
this way is useful at least sometimes, since for me, the #[object! 
...] clearly communicates e.g. the fact, that it is one value, while

--- make object! [...] are, in fact, three values in the Load dialect, 
as Geomol noticed


- similar notes can be written about the escaped format for the function! 
datatype


- the escaped format for natives, (which exists only in R3) is even 
less useful, since it is not loadable, so, in a strict sense of the 
word, it is not even in the Load dialect

-- but (arguably) it can still be used to describe a result of an 
expression when such a demand occurs
Maxim
26-Jul-2011
[1959]
The only problem right now, is that the serialized form of the language 
is just not complete. all the edge cases I can think of have a way 
of being resolved, especially in R3.

having cyclic references be checked and used on object/block types 
would already go a very long way.


#[block  1  [ val1 val2 ...]] ; serialized block with uid as first 
parm (only needed when it is shared in the string being loaded).
#[block  2  [ val3  #[block 1]  val4]  ; shared block
#[block  3  [ #block 3 ]]   ; self-reference


effectively shows a simple way to solve the cyclic series/object 
problem.
Ladislav
26-Jul-2011
[1960x3]
The only problem right now, is that the serialized form of the language 
is just not complete.

 - I would say, that "the Load dialect is not complete relative to 
 the Do dialect", being unable to express some values of the Do dialect.


Nevertheless, the question arises, whether the relative completeness 
is necessary. For example, you demonstrated how cyclic blocks could 
eventually be handled, but, I am not sure you do suggest your solution 
to be used, or just demonstrate the possibility.
Moreover, when I look at it, I have to say, that it actually would 
not be acceptable, since when you do want to mold e.g. your block 
3, you should obtain a representation of one block
Aha, wrong example, I should have used your block 2 as an example
BrianH
26-Jul-2011
[1963]
You forgot to mention: Natives, actions and ops aren't properly serialized 
for a couple reasons:

- The native references wouldn't necessarily be valid between versions.

- It breaks the security constraints, giving access to natives without 
requiring access to their contexts.
Geomol
26-Jul-2011
[1964]
Today's Moment of REBOL Zen:

>> s: "abc"
== "abc"
>> t: copy next s
== "bc"
>> index? t
== 1
>> b: []
== []
>> insert b next s
== []
>> index? b/1
== 2
>> p: copy/deep b
== ["bc"]
>> index? p/1
== 2


So copy/deep a block does not use copy on each member of the block 
in the normal sense of copy.
Steeve
26-Jul-2011
[1965]
I'm not sure to see your point.

But If you want to see if the series are the same or not you have 
to use same?
Actually, Your trial does not  prove your claim
Geomol
26-Jul-2011
[1966x2]
Maybe the following makes it more clear?

>> b: []
== []
>> s: "abc"
== "abc"
>> insert b copy next s
== []
>> index? b/1
== 1
When copying a string, you get what you see.

When copying deep a block containing strings, you get more than what 
you see.
Cyphre
26-Jul-2011
[1968]
Yes, the string is copied in both cases. The difference is that  
copy/deep copies the whole string not only the part that is maked 
by index.
Steeve
26-Jul-2011
[1969x2]
Neither, sorry :-)
index? never gives the absolute position.
just try index? head b/1
try mold/all after and you will see the (hidden) parts
Geomol
26-Jul-2011
[1971]
Yup! :)
Steeve
26-Jul-2011
[1972]
an index is stored alltogether with any serie
Cyphre
26-Jul-2011
[1973]
I'm not sure which behaviour is better though. Ie copying whole string 
vs. just the 'ranges' defined by the series values in the block.
Steeve
26-Jul-2011
[1974]
Don't know, but it would be a problem now, because I use this behavior 
to hide data in blocks (like absolute identifiers)
Cyphre
26-Jul-2011
[1975]
My guess is the current copy/deep behaviour can consume too much 
memory if the strings(or whatever data) are too big.
Steeve
26-Jul-2011
[1976]
You have a point here
Cyphre
26-Jul-2011
[1977]
Here is another way how to ilustrate it clearly:
 
>> s: "abc"
== "abc"
>> mold/all copy/deep reduce [next s]
== {[#[string! "abc" 2]]}
>> mold/all copy next s
== {"bc"}
Steeve
26-Jul-2011
[1978]
is that true only for strings ?
Cyphre
26-Jul-2011
[1979x2]
I think it works same on all series.
>> s: [1 2 3]
== [1 2 3]
>> mold/all x: copy reduce [next s]
== "[#[block![1 2 3]2]]"
>> mold/all y: copy/deep reduce [next s]
== "[#[block![1 2 3]2]]"
>> mold/all z: copy next s
== "[2 3]"
>> same? x/1 next s
== true
>> same? y/1 next s
== false
>> same? z/1 next s
== false
>>
Steeve
26-Jul-2011
[1981x3]
Ok, I agree, it's a problem for 
>> same? y/1 next s
== false
the hidden part should not have beeb copied
Good point Geomol, you found a new ticket
Cyphre
26-Jul-2011
[1984]
yes, the whole serie is copied from HEAD in the copy/deep case...not 
sure if Carl does that intentionally but could be a bug that can 
lead to unwanted bigger memory footprint in some scripts imo.
Maxim
26-Jul-2011
[1985]
Ladislav, typical serialization only takes into account the data 
traversed (in the order it meets it).  in the above example, if the 
block 2 was encountered first, then it would look like this:


#[block  2  [ val3  #[block  1 [ val1 val2 ]]  val4]  ; shared block 
containing another shared block
#[block  1 ]


(I kept the ids, just to make the comparisons easier, but it would 
have effectively swapped 1 and 2)


I built such a system for a project a long time ago (I lost the code, 
unfortunately).   It stored graphics in block formats, and used shared 
sub-blocks in many objects .  So  I built a reference-safe load and 
save which completely made the above invisible... I used tags to 
refer to blocks, and  a tag-based block serialization which was very 
similar to the above.  it was quite specific to my application, but 
it could have been generalized.   I did have to make it a two-step 
process.  if it where internal, it could be done in a single pass.


 a serialization can be made more persistent (accross several serializations 
 and even sessions), but that is not what REBOL is built for, nor 
 would it be very useful within REBOL's semantics IMHO.
Ladislav
26-Jul-2011
[1986]
So, shall I understand it, that you actually propose to use this 
kind format for cyclic blocks?
Maxim
26-Jul-2011
[1987x2]
unless someone finds a better alternative, I don't see anything wrong 
with this syntax... maybe it needs a bit more components (like keeping 
tabs on the index of the block).  
in fact  maybe this is even better:

 #[block  #1 2 [ val1 val2 ]] 


here an issue type is used for the uid and the integer is used as 
the block index.
since this is just managed within LOADing, it shouldn't force the 
word count to increase, its just a notation.
Gabriele
27-Jul-2011
[1989]
I solved the problem of serializing circular blocks etc. a long time 
ago, by adding DISMANTLE and REBUILD. Eg. see http://www.colellachiara.com/soft/YourValues/libs/persist.r

So, it can even be done as a mezz layer above MOLD and LOAD.
Ladislav
27-Jul-2011
[1990]
I guess, that you meant the DISMANTLE-BLOCK and REBUILD-BLOCK functions. 
Nevertheless, the source code does not contain the definition of 
the CUSTOM-TYPE? function.
Gabriele
28-Jul-2011
[1991]
No, dismantle and rebuild are not defined there specifically, they 
are defined as actions for custom types (eg. pblock! etc.). But they 
are based on those two IIRC. http://www.colellachiara.com/soft/YourValues/
Pekr
28-Jul-2011
[1992]
I am doing some tel. report automatic checking, and I need an advice 
- how do I get easily substracted two time values going thru the 
midnight?

>> (fourth 29-7-2011/00:02:00) - (fourth 28-7-2011/23:52:00)
== -23:50


If I substract whole date value, it returns 1, it simply counts just 
dates, not time ...
Maxim
28-Jul-2011
[1993]
>> difference 29-7-2011/00:02:00 28-7-2011/23:52:00
== 0:10
GrahamC
28-Jul-2011
[1994]
this works to a point whereupon you start getting overflow
Sunanda
28-Jul-2011
[1995]
Overflow happens on dates around 68 years apart -- so probably safe 
for Petr's intended usage.
Maxim
28-Jul-2011
[1996]
68.04 years to be precise  ;-)  the seconds resolution in 31 bits

(power 2 31) / 60 / 60 / 24 / 365.25
Pekr
29-Jul-2011
[1997]
Max - thanks :-) I wonder why there is a difference between the 'difference 
and substraction ....
Geomol
29-Jul-2011
[1998x3]
You were subtracting 23 hours and 52 minutes from zero hours and 
2 minutes. That's -23:50.

With difference, the whole date plus time was given, then the difference 
is positive in this example.
Subtract on dates give you number of days. Subtract on times give 
you number of hours, minutes and seconds. Difference on dates (incl 
times) give you number of hours, minutes and seconds.
Maybe subtract on dates should only give days, if time is not given, 
else work as difference?
Henrik
4-Aug-2011
[2001]
I have a COPY/DEEP question:


When doing a COPY/DEEP, the first level requires that the argument 
must be a series!, port! or bitset! But when doing a /DEEP, I imagine 
that COPY traverses a series for elements and uses a different process 
than for the first level to determine whether the element can be 
copied. If it can't, it silently passes the value through.

Why can't we do that on the first level as well?
Gregg
4-Aug-2011
[2002]
Just so you can puT COPY everywhere, without caring about the type?
Henrik
4-Aug-2011
[2003]
I'm not really sure I want to, but I think it's interesting that 
there is a difference between the first level and other levels.
Gregg
4-Aug-2011
[2004]
It makes sense to me. Copy what can be copied. I like having the 
type check at the top level.
Henrik
4-Aug-2011
[2005]
I do dislike having to do:

either series? var [copy/deep var][var]


thing. Generally the programming needed for absolutely deep copy 
a value is too elaborate.
Gregg
4-Aug-2011
[2006]
I don't do that very often. If I did, I would just wrap it.