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

World: r3wp

[Red] Red language group

BrianH
29-Mar-2011
[828]
Or you could insist on this instead:
    a: 0
    b: & a
Dockimbel
29-Mar-2011
[829]
Callbacks: the first step is to be able to output a DLL ;-)
BrianH
29-Mar-2011
[830]
Are there conceptual problems (exports and such) or is it just a 
matter of writing out the files properly?
Dockimbel
29-Mar-2011
[831]
Just implementation, no conceptual issues for outputting DLLs.
Andreas
29-Mar-2011
[832]
I'd have the &[] syntax to always mean "pointer to", i.e. a reference 
type.
And as far as I understand the current spec,
  a: &[integer! 0]

means "a pointer to an integer!, with the pointee's address being 
0"
Dockimbel
29-Mar-2011
[833]
is
   a: &[integer! 0]
equivalent to:
    a: &[struct! [value [integer!]] 
0]  ; a has a value of null

Yes, it is.
Andreas
29-Mar-2011
[834]
It would therefore be equivalent to
a: &[struct! [value [integer!]] 0]

if structs don't require any storage space (except padding) on their 
own.
BrianH
29-Mar-2011
[835x2]
I prefer to think of it as syntaxtic sugar, but basically yes. And 
structs should be padded explicitly somehow, with a sensible default.
syntaxtic - syntactic
Andreas
29-Mar-2011
[837]
At the moment, it really is no syntactic sugar, I fear :)
BrianH
29-Mar-2011
[838]
Only relatively :(
Dockimbel
29-Mar-2011
[839x3]
Wait, there's a mistake in my example in the blog: 
    p: &[integer! 0]
is not equivalent to :
    p: struct [value [integer!]]


The struct value takes an additional storage space for the integer 
value while the pointer doesn't. :-(
Adding this default 0 value was really just adding confusion.
I jumped to the pointer dropping option too fast.
BrianH
29-Mar-2011
[842]
Are you going to allow the word none as an equivalent to the null 
pointer value?
Andreas
29-Mar-2011
[843x2]
I think they both require the same amount of storage space (ignoring 
possible padding).
Ah, no, they don't.
BrianH
29-Mar-2011
[845]
Wait, doesn't the STRUCT function take a parameter for the initial 
value?
Dockimbel
29-Mar-2011
[846]
none: I think Kaj has already defined it as null in his 0MQ wrapper. 
:-) So, I could add it in the common runtime file, it costs nothing 
(which is the least for none). :-)
Andreas
29-Mar-2011
[847]
Nope, struct has no initialiser.
Dockimbel
29-Mar-2011
[848]
STRUCT: it is a keyword, not a function. The memory space it takes 
is zero-filled.
BrianH
29-Mar-2011
[849]
I figured as much, since the type system would need this to be a 
keyword because the type returned is derived from the argument.
Andreas
29-Mar-2011
[850]
Hmm, that may be a stupid question, but: why not simply use a POINTER 
keyword similar to STRUCT for pointer declaration.
BrianH
29-Mar-2011
[851]
I was thinking that none could be a none! type, and then autoconvert 
to the particular reference type on assignment. Or it could be of 
type handle! in Red/System, with a predefined 0 value.
Dockimbel
29-Mar-2011
[852]
Andreas: could work and it  would be more consistent with struct. 
The other option is using & both for pointer and struct references.
BrianH
29-Mar-2011
[853]
Well, you don't really need a POINTER keyword if pointers are just 
syntactic sugar for struct references. Then & could be the keyword 
for both.
Andreas
29-Mar-2011
[854]
If you are happy with allowing address arithmetic on struct references, 
that's fine.
Dockimbel
29-Mar-2011
[855]
That sounds good. I need to take some time tomorrow to think about 
all that and see if there's no drawback hiding somewhere.
Andreas
29-Mar-2011
[856]
But I think struct padding requirements will kill address arithmetic 
on struct references for the general case.
BrianH
29-Mar-2011
[857]
Padding should be explicit in the struct declaration syntax, or default 
to no padding.
Andreas
29-Mar-2011
[858]
Padding is platform-specific.
BrianH
29-Mar-2011
[859]
Right. And language-specific and library-specific on any given platform. 
That is why it needs to have a good way to specify it.
Maxim
29-Mar-2011
[860]
wouldn't the arithmetic, just use the padding as part of the size?
BrianH
29-Mar-2011
[861]
That's why C compilers have pragmas for padding.
Andreas
29-Mar-2011
[862x2]
C is the target here.
For C and a given platform (and a given compiler, for some weird 
corner cases), default alignment/padding behaviour is specified.
BrianH
29-Mar-2011
[864]
Right. And since that changes from platform to platform and compiler 
to compiler we need a way to match those differences, with declarations 
or options or pragmas, same as the C compilers do.
Andreas
29-Mar-2011
[865x2]
The important issue is that the defaults match, if we want to have 
any.
Otherwise we can just drop the whole attempt at easier integration 
with C and go with a much more sensible storage layout dialect (think 
e.g. Erlang bitstrings).
BrianH
29-Mar-2011
[867x2]
Another important issue is that the defaults be settable on a per-platform 
or per-app basis, and that the behavior of Red/System is explicitly 
defined in a cross-platform way. We don't want to repeat the mistakes 
of C just because we're interfacing with C.
A lot of the stuff we have to integrate with will have C interfaces, 
but those interfaces will have struct layouts in them that were declared 
with precision for binary compatibility, using the pragmas and stuff 
that C was retrofitted with to allow such precision. We need those 
kinds of abilities from the beginning, or we'll have to retrofit 
it on later just like C did.
Andreas
29-Mar-2011
[869]
We'll probably still want to cater to the vast majority of C interfaces 
which just uses platform/compiler defaults.
BrianH
29-Mar-2011
[870]
Plus, struct references will be used to convert data to and from 
binary data read from files and network protocols, and those also 
need precise definitions.
Andreas
29-Mar-2011
[871]
I'd use a different and far more powerful dialect for that.
BrianH
29-Mar-2011
[872x2]
Right, we need settable defaults that can match the local C standard 
or whatever it is that sets the standard locally (JNI perhaps).
But if you don't have a way to specify the padding and maybe alignment, 
you won't be able to interface with C code that sets that stuff too.
Andreas
29-Mar-2011
[874x2]
One dialect for conveniently interfacing with C ("structs"), a different 
dialect ("records"?) for 100% precise control over bit layouts. Plus 
a way to convert between the two.
The former quite possibly replicating some C quirks, probably a few 
of the most important ones, as needed.
BrianH
29-Mar-2011
[876x2]
C structs are what I'm talking about, particularly ones declared 
with the pragmas. The quirks can go in the settable defaults, including 
things like the size of certain datatypes that have ill-specified 
types in the C standard.
You are a little spoiled on Unix-like platforms, Andreas. On Windows 
there is no standard C compiler; there are a bunch of competing ones 
instead. Each has its own quirks and defaults. Since Red is not itself 
written in C, you can't just go with the quirks of the same compiler 
it is written in. And different libraries are compiled by different 
people with different compilers. If you want to interface with them, 
you have to be specific.