Jump to content

Use another language to call a function: Difference between revisions

add Mercury
(Added COBOL (GnuCOBOL in particular))
(add Mercury)
Line 979:
clean:
rm -f $(TARGET) *.o query.c</lang>
 
=={{header|Mercury}}==
 
The code as written is horrible for Mercury, so some additional C is added as a shim that actually calls the Mercury predicate. Although no changes are required to the C code in this simple example, in a larger project, with modules that need initialization, there are [https://mercurylang.org/information/doc-latest/mercury_user_guide/Using-mmc.html some additional compilation steps] needed to get that initialization code in.
 
<lang Mercury>:- module query.
:- interface.
 
:- pred query(string::in, string::out) is det.
 
:- implementation.
 
query(_, "Hello, world!").
 
:- pragma foreign_export("C", query(in, out), "query").
 
:- pragma foreign_decl("C",
"
#include <string.h>
int Query (char * Data, size_t * Length);
").
:- pragma foreign_code("C",
"
int Query (char *Data, size_t *Length) {
MR_String input, result;
MR_allocate_aligned_string_msg(input, *Length, MR_ALLOC_ID);
memmove(input, Data, *Length);
query(input, &result);
*Length = strlen(result);
memmove(Data, result, *Length);
return 1;
}
").</lang>
 
Building with the unchanged C in useanother.c:
 
<pre>$ mmc -c query
$ gcc -Wall -c useanother.c
$ ml -o useanother useanother.o query.o</pre>
 
{{out}}
<pre>Hello, world!</pre>
 
=={{header|Nim}}==
Anonymous user
Cookies help us deliver our services. By using our services, you agree to our use of cookies.