[mercury-users] number of args for bag.init exported to C
Paul Bone
pbone at csse.unimelb.edu.au
Wed Jun 8 11:43:50 AEST 2011
On Tue, Jun 07, 2011 at 04:38:49PM +0200, Guillaume Yziquel wrote:
> Hi.
>
> I'm exporting the bag.init function with the following pragma:
>
> :- pragma foreign_export("C", bag.init(out), "no_props").
>
> And the C function prototype that is exported is:
>
> void no_props(MR_Word, MR_Word *);
>
> What is the meaning of the first argument? There is no 'in' argument in
> the Mercury code, and yet it shows in the C function prototype. More
> importantly: what should I set it to?
>
> I tried investigation the C code, but the way Mercury generates code
> with kind of virtual registers doesn't lend itself to an immediate
> understanding of the C code for bag.init.
Most likly the first argument is used to pass a type info structure.
You're creating a bag that will have the type bag(T) where T is a variable.
When this code is compiled an implicit argument is added.
bag.init(TypeInfoForT, Bag) :- ...
The easiest way to work around this is to know the type of the bag that you're
creating and create a predicate that creates that type of bag. This way
Mercury will provide the first argument for you. For example, I can construct
a bag of ints.
% Note that I specify bag(int) as the type, this way the polymorphism
% transformation is not necessary.
%
:- pred bag_of_ints_init(bag(int)::out) is det.
:- pragma foreign_export("C", bag_of_ints_init(out), "no_props").
bag_of_ints_init(Bag) :-
bag.init(Bag).
Hope this helps.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 490 bytes
Desc: Digital signature
URL: <http://lists.mercurylang.org/archives/users/attachments/20110608/ad484e49/attachment.sig>
More information about the users
mailing list