On Mon, Jun 16, 2014 at 08:08:50PM -0700, Walter Bright via Digitalmars-d wrote:
> On 6/16/2014 5:44 AM, "Ola Fosheim Grøstad"
> <ola.fosheim.grostad+dl...@gmail.com>" wrote:
> >As far as I can tell string mixins have the same bad properties that
> >macros have.
> 
> Assuming you are talking about C macros:
> 
> Having implemented the C preprocessor (multiple times), make's macro
> system, designed and implemented ABEL's macro system, Ddoc's macro
> system, and string mixins, I can unequivocably object to that opinion!
> The C macro system is awesome in its awfulness. Let me count the ways:
> 
> 1. Probably < 10 people in the world actually understand it all the
> way down. It is absurdly complex for what little it does. Paul
> Mensonidas is usually acknowledged as the "world's leading expert on
> the C preprocessor." Why would a freakin' macro processor even have an
> ecological niche for a world leading expert on it? The mind boggles.

So that you can write IOCCC entries that abuse the dark corners of cpp,
of course. ;-)


[...]
> 5. There is no scoping of names of any sort - no hygiene whatsoever.
> Any #include file can trash any subsequent, unrelated, #include file
> in any way.

Do string mixins have scoping of names?

I do agree, though, that D's string mixins eliminated a whole class of
cpp abuses by requiring that the input string be a set of complete
statements or declarations -- things like:

        mixin("writeln(");
        mixin(");");

are rejected by the compiler, whereas in C:

        #define MIXIN_1 writeln(
        #define MIXIN_2 );

        MIXIN_1 MIXIN_2

are happily accepted, leading to IOCCC tricks like:

        #define block(x) { x }
        #define split_block(y) } y {

        void func()
        block(
                printf("a");
                split_block(void main())
                printf("b");
        )

        // The above nastiness translates to:
        void func() {
                printf("a");
        }
        void main() {
                printf("b");
        }


(To my shame, I must admit that I actually did this in an IOCCC entry --
in fact, in an even worse form than shown above.  :P)

None of this insanity is permitted by D's string mixins, which is a big
plus, in my book.


> 6. Any syntax highlighter cannot work entirely correctly without
> having a full preprocessor.

And how would you syntax-highlight a string mixin that's assembled from
arbitrary string fragments?


> 7. Because of the preprocessor, valid C code need not look remotely
> like C code according to the C grammar.

Ah yes, this brings back sweet memories of this amusing little IOCCC
entry:

        http://www.ioccc.org/2005/chia/chia.c

:-)


> 8. There are no looping macros, no CAR/CDR capabilities (Ddoc has the
> latter).
[...]
On Mon, Jun 16, 2014 at 08:10:40PM -0700, Walter Bright via Digitalmars-d wrote:
> On 6/16/2014 8:18 AM, "Ola Fosheim Grøstad"
> <ola.fosheim.grostad+dl...@gmail.com>" wrote:
> >Sure,  just like m4 and cpp can be extremely powerful. Too powerful…
> 
> One of the sins of cpp is it is not powerful enough, forcing a lot of
> awkward usages.

I thought cpp's non-Turing-completeness was actually intentional? As if
cpp nastiness isn't already bad enough, as you pointed out above... I
dread to imagine a cpp that is "powerful enough"(!).

In any case, string mixins are better than cpp in several ways, but they
still do suffer from some of cpp's problems.


T

-- 
Stop staring at me like that! It's offens... no, you'll hurt your eyes!

Reply via email to