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

World: r3wp

[Red] Red language group

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!".
Kaj
18-Jun-2011
[2147x2]
Yes, that's a fundamental problem with a preprocessor
But the more tangible problem is that currently, you don't have to 
cast when you allocate a string, and that will change when a proper 
byte pointer is introduced
Dockimbel
18-Jun-2011
[2149]
Right, but this is an alpha, not a v1. Maybe I should postpone the 
beta announcement by a month or two?
Kaj
18-Jun-2011
[2150x2]
You don't have to, because the fix is only half a line, and I don't 
need it before Monday
Anyway, I've brought forward my concerns; that's all I can do
Dockimbel
18-Jun-2011
[2152]
Well, thanks for the feedback, I will think about all the possible 
options.
Kaj
18-Jun-2011
[2153x2]
OK, thanks
I see you're using byte! definitions for C functions that take integer! 
parameters. Is that guaranteed to be interpreted as an integer?
Dockimbel
18-Jun-2011
[2155]
Are you referring to memset() wrapper?
Kaj
18-Jun-2011
[2156]
Yes. What's the conversion applied there?
Dockimbel
18-Jun-2011
[2157x2]
No conversion at all. The memset case is a old C oddity that never 
got fixed. It should have a byte in the declaration instead of int. 
The algorithm in memset uses a byte and not an int, so the Red/System 
binding is not only safe, but also cleaner than the C one. The memset 
oddity is explained there: http://stackoverflow.com/questions/5919735/why-does-memset-take-an-int-instead-of-a-char
Jocko, answering your questions:
- is this correct ?
    Yes, I tested it here, works flawlessly.

- how and where de-allocate the c-string ?

    Same as in C, when you don't need it anymore. So in your code example, 
    it would be after "print res".

- why the end-string symbol is not added automatically ?

    Red/System is a low-level language, it treats c-string! as C does 
    with string, the trailing zero is only a convention. If ReadConsole() 
    doesn't add a trailing zero, only the programmer knows if and where 
    it should be added. Red/System can only add automatically trailing 
    zero on literal c-string! because, in that case, it can easily guess 
    where the c-string! ends.
Kaj
18-Jun-2011
[2159x7]
Doc, thanks for the link; that's informative
I've updated both my C library binding and my 0MQ binding to work 
with the latest Red
A lot of changes were needed, most of them for the stricter checking
Callbacks can now be passed to imported functions with fully defined 
specs. However, function specs can not be defined as the return value 
of an imported function:
on-signal: "signal" [  ; Register handlers for receiving system signals.
			signal		[integer!]
			handler		[function! [signal [integer!]]]  ; Flag or callback
;			return:		[function! [signal [integer!]]]
			return:		[handle!]
		]
Also, callbacks can't be passed as such to native functions. In some 
cases they can still be passed as unspecified handles, but those 
can't be cast to callback functions. I have a wrapper for atexit() 
that is now impossible to define:
on-quit: func [  ; Register handler for normal program termination.
;	handler		[function! []]  ; Callback
	handler		[handle!]  ; Callback
	return:		[logic!]
][
	not as-logic _on-quit handler
]
jocko
19-Jun-2011
[2166]
Doc, thanks for yor answers
Dockimbel
19-Jun-2011
[2167x4]
Kaj: function! is just a pseudo-type (not a first-class type) that 
was introduced just to be able to verify callback signatures when 
passed to an external library.
I will have a look today on your issue and see if allowing function! 
to be passed as argument and returned as value is safe and side-effect 
free in the current state of the implementation.
Kaj: on Windows, it is possible to use _get_osfhandle() to retrieve 
the file handle for stdin/out/err (http://msdn.microsoft.com/en-us/library/ks2530z6.aspx)
I can't find an equivalent in UNIX world.
Kaj
19-Jun-2011
[2171]
I know, you have to import it as a symbol as far as I can see
Dockimbel
20-Jun-2011
[2172]
Kaj: you have now a polymorphic NULL for all pointers (struct, pointer, 
c-string) and a new pointer! [byte!] type. byte-ptr! has been redefined 
to pointer! [byte!] instead of c-string!.
Oldes
20-Jun-2011
[2173]
Is it possible to specify a build target per file? If I don't want 
to use %builds/ folder, but for example %builds/project/ and specify 
it in the project.reds file header.
Dockimbel
20-Jun-2011
[2174]
Not yet, but Andreas should add it soon. Taking the output path/name 
from script header is a good idea.
Oldes
20-Jun-2011
[2175]
Cool... I'm able to obtain image size from red using iMagick
Dockimbel
20-Jun-2011
[2176]
Nice, let us know if you hit any issue.
Oldes
20-Jun-2011
[2177x5]
the main issue is that I had to find out, how to print integers:) 
Kaj's C-library is not working on windows.
*** Compilation Error: multiple type casting not allowed
*** in file: %runtime/../library/C-library.reds
*** in function: temporary-name
*** at:  [as c-string! null]
here is a fix:
-- 	_temporary-name as-c-string none
++	_temporary-name none
for a real work with iMagick, the decimal numbers are required.
Dockimbel
20-Jun-2011
[2182]
Kaj has not yet updated the C library binding to the latest Red/System 
version.