Re: [m-users.] Using MR_list_cons inside of C functions

Peter Wang <[email protected]>
Newsgroups gmane.comp.lang.mercury.general
Message-ID <[email protected]>
On Tue, 18 Jul 2023 18:48:55 -0700 M McDonough <[email protected]> wrote:
> 
> :- pragma foreign_code("C", "
> // Note that this is NOT a foreign_proc, but it is recursive, it
> // calls Mercury code, and it also uses MR_list_cons.
> MR_Word CreateNode(const struct C_Node *c_node){
>     MR_Integer i;
>     MR_Word child_nodes = MR_list_empty();
>     // Iterate in reverse because we are constructing a list in reverse.
>     i = c_node->num_children;
>     while(i--){
>         child_nodes = MR_list_cons(
>             CreateNode(node->children + i),
>             child_nodes);
>     }

There are piles of macros.

The problem is that the argument of MR_list_cons(), the call to
CreateNode(), is not evaluated before MR_list_cons() starts doing
anything. You should make the call CreateNode() first, assign the
result to a variable, then perform the MR_list_cons().

I'm not sure if we should fix or just document this problem with
MR_list_cons() and similar macros. The fix would require use of GCC's
statement expressions extension. In other cases where we've used
statement expressions, we have a portable fallback that uses a function
instead of a macro, but that requires code duplication.
Or perhaps we can rely on function inlining?

Peter
_______________________________________________
users mailing list
[email protected]
https://lists.mercurylang.org/listinfo/users
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.