Eli Barzilay wrote:
20 minutes ago, Neil Toronto wrote:
No, it's just a thin wrapper around the C data. But you can create
the C type that you need to talk to the library and a racket
struct (with anything you want there). Make the racket struct hold
the C value in it, and write a ctype for it that translates trivially
to/from the lower level type.
where mpfr constructs instances of _mpfr_t from Racket reals. As it is,
I'm defining a struct wrapper,
Uh, that.
which seems like a pointless indirection.
(I don't see why, either way you need some pointer going to some
data.)
It looks like this:
(struct bigfloat (mpfr-value)
#:property prop:custom-write ...)
I have a struct type with just one field. Every time I'm forced into
doing that, it seems like a pointless indirection. (It's *only* an
indirection; I'm not aggregating anything.) But if that's the only way,
I'm fine with it.
(define gimme-string
(get-ffi-obj 'gimme_string libmpfr (_fun -> _pointer)))
@c{
char* cstr_id(char* p)
{
return p;
}
}
(define cstr->string
(get-ffi-obj-from-this 'cstr_id (_fun _pointer -> _string)))
(define cstr (gimme-string))
(define str (cstr->string cstr))
(special-free cstr)
It's silly. But I can't figure out another way to have the FFI
library interpret a char* pointer as a string AND give me access to
the pointer itself so I can free the memory. I get the impression
that it's possible, but I don't know the right incantations yet.
Why aren't you using a byte string directly?
Let me sum up.
The C library provides gimme_string (actually something with a more
complex type signature), which allocates a char* in some special way and
returns it. The library also provides special_free, which takes a char*
and frees it in a special way.
I need to call gimme_string and use the return value as a string, but
also have the return value as a pointer so I can pass it to
special_free. If I get gimme_string with (_fun -> _string) or (_fun ->
_bytes), I don't get a pointer, I get a string? or a bytes?.
Neil T
_________________________________________________
For list-related administrative tasks:
http://lists.racket-lang.org/listinfo/users