World: r3wp
[Red] Red language group
older newer | first last |
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. | |
older newer | first last |