An even more modest proposal...
Ben Cooley
Ben_member at pathlink.com
Mon May 15 22:48:18 PDT 2006
In article <Pine.LNX.4.64.0605152210020.2422 at bellevue.puremagic.com>, Brad
Roberts says...
>
>On Tue, 16 May 2006, Ben Cooley wrote:
>
>> Allow D to import a GCC-XML or an alternative xml file with the class hierarchy,
>> structure layout, members, methods, and macros defined in a c or cpp header, and
>> be able to access members, call non-inlined methods, or auto-generate a .cpp
>> file with cpp code or functions for inline methods calls or template
>> instantiations in D.
>>
>> This would eliminate the need for D to be responsible for parsing Cpp, and
>> directly provide the D with the information it needed to interoperate with
>> existing C or Cpp libraries and code. The responsibility of generating that
>> file would be from an externally supported Cpp parser like GCC XML, Elsa, or
>> Swig.
>>
>> D = Cpp/CLI .... XML = CLI. That would be an apples to apples comparison.
>>
>> How you generate that XML file is your problem.
>
>I invite you to do it and show us that it's as easy and possible as you
>claim. The problems are enormously technically complex, as quite a few
>people have said several times already. It's incredibly unlikely that
>anyone is going to do this just because you want it done.
>
>I could repeat a number of the already covered topics, but it's obvious
>you aren't willing to accept them. Please, prove everyone wrong and get
>it working.
>
>I'll even suggest a relatively low barrier to entry: Show that you can
>call a c++ class (no inheritance involved) with an api that takes a
>std::string and throws that string back to the caller as an exception.
>The caller has to be able to catch that std::string.
>
>Later,
>Brad
Sure...
CppType("std::string") str = NewCppObject("std::string(\"A string\"");
CppType("std::string") ret;
// Inline cpp code which is placed in the .cpp file generated for this file
cpp {
try {
throwFunction(%%str);
}
catch (std::string exstr)
{
%%ret = exstr;
}
}
return CppCallMethod("ret.c_str()");
-----------------
The intrinsics compile directly to D code. The inline cpp code is exported to
the associated generated .cpp file the same way that the calls to other inline
cpp code are:
extern "C" {
void __somefunction_inlinecpp(std::string& str, std::string& ret)
{
try {
throwFunction(str);
}
catch (std::string exstr)
{
ret = exstr;
}
}
}
Since D can directly link with C, you have yourself a pretty decent way of
easily inlining Cpp code by simply generating a C function for each cpp inline.
Now... was that really all that complicated?
More information about the Digitalmars-d
mailing list