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

World: r3wp

[Red] Red language group

Dockimbel
18-Jun-2011
[2097]
You should erase the "void pointer" expression from your mind, it 
is corrupting your vision. :-)
Kaj
18-Jun-2011
[2098x2]
Again, I don't care much what it is (although I wouldn't expect ALLOCATE 
to return a c-string!), just that the definitions are compatible, 
so you don't have to insert confusing typecasts everywhere
I'm just following what you have written in the manual about pointers
Dockimbel
18-Jun-2011
[2100]
the definitions are compatible
: which ones?
Kaj
18-Jun-2011
[2101]
NULL, byte-ptr! and the manual use three type incompatible definitions. 
I must compare and pass these types
Dockimbel
18-Jun-2011
[2102]
NULL and documentation will be fixed during this weekend.
Kaj
18-Jun-2011
[2103]
So will they be compatible with byte-ptr! thereafter?
Dockimbel
18-Jun-2011
[2104x2]
NULL should work with any kind of pointer/struct or be removed.
I haven't decided yet on the right solution, but you can safely use 
ALLOCATE as it is defined right now, that won't be changed.
Kaj
18-Jun-2011
[2106]
Not really, because casts are needed on every use of ALLOCATE and 
FREE
Dockimbel
18-Jun-2011
[2107x2]
That would be the case whatever type you would put in the return 
definition of ALLOCATE?
As you can allocate memory space for various datatypes.
Kaj
18-Jun-2011
[2109]
No, because there's one exception: the type that ALLOCATE and FREE 
choose to use
Dockimbel
18-Jun-2011
[2110]
You've lost me...what type are you talking about?
Kaj
18-Jun-2011
[2111]
They currently use c-string! I'm not sure that's the clearest one. 
It's unintuitive to me, as if the type returned is very specific 
and comes with a zero byte at the end
Dockimbel
18-Jun-2011
[2112]
That is why I have not put c-string! but byte-ptr!.
Kaj
18-Jun-2011
[2113]
I know, but that gets lost during compilation. What the compiler 
complains about is that you have to cast to and from c-string!
Dockimbel
18-Jun-2011
[2114x2]
Do I really need to add a new [pointer! [byte!]] to the compiler 
just to make this error message looks nicer?
(I mean adding a new datatype in the compiler).
Kaj
18-Jun-2011
[2116]
I think that would be very useful, but that's the more fundamental 
pointer discussion. I'm now just concerned about making casts the 
least confusing
Dockimbel
18-Jun-2011
[2117x2]
I pretty sure that some ppl would complain that [pointer! [byte!]] 
is exactly the same as c-string!...;-)
I don't get what is the issue with casting (expect the error message)?
Kaj
18-Jun-2011
[2119]
Sure, but I mean, we had two definitions of a generic pointer: integer! 
or pointer! [integer!]. Why confuse it with c-string! now?
Dockimbel
18-Jun-2011
[2120x7]
expect => except
Well, I have already answered that question above. I am sorry if 
that change breaks existing code. Once again, the C void pointer 
is a very confusing concept that should not be used outside of C 
language. If you refer to a C void pointer without any context, it 
is just a memory address, so integer! (or handle!) would be the closest 
corresponding concept. If you refer to a C function returning a void 
pointer like malloc(), the closest transposition in Red/System would 
be ALLOCATE returning a byte! pointer.
Malloc() allocates a memory region that granularity is by default 
a byte (until you cast is to something else).
So, in summary, there is no 1 to 1 transposition of the C void pointer 
concept in Red/System, it is 1 to 2 (or more), depending on the context.
If you would write a C function such as: 

void *bar() { return((void *)&foo);)


where foo would be another function. If I had to make a binding to 
this function from Red, I would use integer! (or preferably the handle! 
macro) to define the return value.
Six months ago, I wanted to introduce an address! type to be the 
equivalent of C void pointer. It would have worked as an integer!. 
But as it would have been only used to in C binding definitions, 
I thought it would be a waste to have a first-class datatype just 
for that, when integer!, pointer! [...], or a macro could do the 
same job.
If [pointer! [byte!]] could do the job and make C coders happy, I 
will add it to Red/System.
Kaj
18-Jun-2011
[2127x5]
I'm not concerned with all that here. Let me make this very concrete. 
In runtime/common.reds, changing
#define byte-ptr!	c-string!
to
#define byte-ptr!	pointer [integer!]
Would solve all my current concerns
Dockimbel
18-Jun-2011
[2132]
Well, this is certainly not the right definition a byte! pointer. 
:-) Can't you wait until monday when all the current issues regarding 
NULL and documentation will be fixed?
Kaj
18-Jun-2011
[2133x3]
We have been aware that pointer [integer!] does not accurately describe 
a pointer [byte!] but you don't want to implement that in the current 
development cycle and that's fair enough. It's only a cosmetic problem 
right now
Originally I though binary! was going to fulfill this role, but it 
was removed
Will the NULL enhancement change the types handled by ALLOCATE and 
FREE to one generic pointer definition? Let's stop calling it void, 
but instead variant, which it really is
Dockimbel
18-Jun-2011
[2136]
Binary!: you're right, that was an option I considered at the beginning. 
But I thought that it would be even more confusing for REBOL coders.
Kaj
18-Jun-2011
[2137x2]
It felt very natural to me
We're in a morass now ;-)
Dockimbel
18-Jun-2011
[2139x4]
Think about ppl that would have complained about LENGTH? not working 
on binary! type. ;-)
No, that would not change the types of ALLOCATE and FREE, I would 
only change them to pointer! [byte!] when it will be available.
There is no generic pointer in Red/System.
Even if binary! was there, it would work as a byte! pointer.
Kaj
18-Jun-2011
[2143x3]
I thought so, so ALLOCATE and FREE will still deliver types that 
I wouldn't expect from them, and that effectively introduce an extra 
definition of a variant pointer
The LENGTH? example is interesting, because people will now use it 
on an allocated binary, expecting that it's zero-terminated, and 
even if it is, the expected length will be off by one
Or much more if there's a zero somewhere in the middle
Dockimbel
18-Jun-2011
[2146]
You're extrapolating from the error message. The definition says 
"byte-ptr!" not "c-string!".