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

World: r3wp

[Red] Red language group

Dockimbel
29-Mar-2011
[798x3]
yup :-)
I've fixed the array! examples, thanks.
But I agree with you also about your last comment. Things like arrays 
are a PIA to interface with using R2's struct!.
Andreas
29-Mar-2011
[801]
Hmm, I maybe should've read the spec more carefully, but:
BrianH
29-Mar-2011
[802]
The & syntax would be for struct references and the # syntax for 
struct values. And if you initialize your struct reference with a 
integer it will be a pointer value, but if you initialize it with 
a block then an inline struct could be built and then referred to 
with the reference. So this:
    a: &[integer! 0]
would be the same as this:
    a: &[struct! [value [integer!]] [0]] 
or this:

    set a: &[struct! [value [integer!]]] & #[struct! [value [integer!]] 
    [0]]
Andreas
29-Mar-2011
[803x2]
Ah, ok, nevermind.
I wouldn't re-use the & syntax for array datatypes.
BrianH
29-Mar-2011
[805]
And you can use make struct! instead of #[struct! ] since the compiler 
can do the same thing in both cases, and then R2 wouldn't complain.
Dockimbel
29-Mar-2011
[806]
>> make struct! [a [pointer!]][0]
** Script Error: Invalid argument: pointer!
Andreas
29-Mar-2011
[807x2]
Referring to section 4.2, if `&[string! 0]` equals `char*`, what 
does string! equal?
I think string! should be char*, &[string!] should be char**, and 
&[pointer! [string!]] should be char***. But maybe I'm missing something 
:)
BrianH
29-Mar-2011
[809]
Not at the source level, Doc. Just because that won't work in R2 
doesn't mean it won't load.
>> load "make struct! [a [pointer!]][0]"
== [make struct! [a [pointer!]] [0]
]
Dockimbel
29-Mar-2011
[810x2]
Andreas: you're right, there's an issue on that line, char *p should 
match string!.
Brian: you're right, it has been a long day... :-)
BrianH
29-Mar-2011
[812x2]
It would be better if you could match the MAKE argument model of 
R3 rather than that of R2. Have MAKE take two parameters, not 2+.
That is a special case in R2 that makes everything difficult. It 
was a good change.
Dockimbel
29-Mar-2011
[814]
But, that solution would turn MAKE into a keyword, so I couldn't 
use it anymore for making a malloc( ) wrapper for example. It could 
work with some tweaks in the compiler, but I'm not sure such hack 
would be desirable.
BrianH
29-Mar-2011
[815]
No, the R2 model turns MAKE into a keyword. The R3 version can just 
be a function.
Dockimbel
29-Mar-2011
[816x2]
Make: I agree, fixed arity is a cleaner way.
Make: I was thinking in Red/System context. I would need to turn 
MAKE into a keyword in order to spot literal struct! values.
BrianH
29-Mar-2011
[818x4]
You would want to do that anyways for other literal values, though 
the function use would be a fallback in case the spec is an expression.
What's the problem with making MAKE a keyword? You don't have function 
values in Red/System, and you don't want it redefined without the 
compiler knowing about it. Speaking of which, typed function references 
with overloaded &[function! [...]] syntax?
Some C libraries take function pointers as arguments to their APIs.
Unless you don't want to handle the callback problem yet.
Dockimbel
29-Mar-2011
[822x2]
I guess I could do the fallback on expressions in order to use it 
as a function too.
Functions: yes I was thinking about reusing the & symbol for getting 
function references.
BrianH
29-Mar-2011
[824]
And if MAKE is a keyword, depending on the expression it could fallback 
to calls to different functions.
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.