World: r3wp
[Red] Red language group
older newer | first last |
Dockimbel 29-Mar-2011 [825] | Callback: not now, it is too early. |
Maxim 29-Mar-2011 [826] | considering callbacks are just pointers, its not that big a deal to provide the capabilities... all you need is a way to get the address of a function rather than call call it, and you're good to go. this could be achieved easily with get-word notation... |
BrianH 29-Mar-2011 [827x2] | Wait, is a: &[integer! 0] equivalent to: a: &[struct! [value [integer!]] 0] ; a has a value of null or this: a: &[struct! [value [integer!]] [0]] ; a points to an integer with a value of 0 I would prefer the former. Then this code: a: &[integer! [0]] might be equal to the latter, with the integer being allocated as a local variable on the stack. |
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 [874] | 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. |
older newer | first last |