In the end, I'm sure, that manual intervention won't be necessary and
the CAPI repository will be replaced by std.c.translate or something
like that.
You'd just do this:

mixin cInclude("sqlite3.h");

and voila.

The mixin will print out all macros, which i couldn't translate and
had to evaluate in-line. If some of those macros are important to the
user, then translating a C header would consist of including the
header and adding the missing macros.

I think this is a much better idea, then manually translating
everything, because this is cheaper, covers more libraries.

On Tue, Oct 25, 2011 at 12:13 PM, Gor Gyolchanyan
<gor.f.gyolchan...@gmail.com> wrote:
> Sure. You're right. Weird macros are often used for handy shortcuts
> (like the aforementioned for loop header), which are not handy enough
> to invent a just-as-weird way of translating them. Everything else is
> either for compiler extensions (which either have built-in support in
> D or are simply nit translatable) or hacks for compile-time activity
> (can be replaced by more intuitive counterparts in D).
> Translating _any_ C code is impossible. The C preprocessor cannot be
> fully simulated in D. But translating _this_ C code is not as hard,
> because it's a bad practice to abuse macros in C and no good C library
> would do that.
> The translator should not be a "_any_ C code translator", it should be
> an "arbitrary _this_ C code translator", which makes a few assumptions
> and does not guarantee 100% convertibility of the code.
> The most important part of the translator should be the problem
> reporter, which should point you to all the suspicious and
> untranslated parts of the C code, so you can deal with them manually.
>
> On Tue, Oct 25, 2011 at 6:36 AM, Marco Leise <marco.le...@gmx.de> wrote:
>> Am 21.10.2011, 10:32 Uhr, schrieb Gor Gyolchanyan
>> <gor.f.gyolchan...@gmail.com>:
>>
>>> That's ALL you can do in C. fill structs and call functions
>>> (fundamental type manipulation doesn't count).
>>> My personal research shows the following use cases of C macros (sorted
>>> by popularity in descending order):
>>> 1. enum
>>> 2. alias (most notably, conditionally compiled ones)
>>> 3. CTFE function
>>> 4. mixin template
>>> 5. syntactic alias
>>> 6. syntactic mixin template
>>>
>>> only the last 2 out of 6 cannot be translated to D.
>>> An example of a syntactic alias is this very common piece of C code:
>>> #ifdef __VERY_VERY_OLD_C_COMPILER__
>>>    #define CONST
>>> #else
>>>    #define CONST const
>>> #endif
>>
>> Maybe these cases can often be solved when, as you say, they are for
>> compatibility with other compilers. The header converter would simply assume
>> to be the latest and greatest of the known compilers and evaluate the code
>> like this:
>> - there is an #ifdef
>> - if it a define from the list of "known C compilers with quirks"
>>  - jump right to the else block
>> The #define obviously can become more than one thing in the .d file. But
>> that is determined by the instantiation site. The above CONST would probably
>> be ignored when it is used in a const parameter declaration, because of D's
>> transitivity and become 'immutable __gshared' when used on a global
>> variable. Do you get the idea?
>>
>

Reply via email to