On Tue, Apr 20, 2010 at 10:34 AM, Julian Foad <julian.f...@wandisco.com>wrote:

> Daniel Shahaf wrote:
> > Julian Foad wrote on Tue, 20 Apr 2010 at 11:49 +0100:
> > > Hmm... I wonder if we could do something with a macro that takes the
> > > whole block of code to be executed as an argument, like:
> >
> > A code block inside a macro call??
>
> Well, I tried it and it works and I kind of like it... but really I
> tried it for fun and I'm not sure if we should be seriously considering
> anything like this.
>
> >   Perhaps we write a macro in the
> > style of SVN_DBG --- one that is "pseudo-variadic"...
> >
> > For example (not tested):
> >
> >     #define SVN_ITER_ARRAY2(element_type, element_name, array, iterpool,
> pool, func_name, (arg1, arg2)) \
> >         SVN_ITER_ARRAY(element_type, element_name, array, iterpool, pool,
> func_name(arg1, arg2))
>
> I think you mean something like (with a backslash after every line):
>
> #define SVN_ITER_ARRAY2(element_type, element_name, array,
>                        iterpool, pool,
>                         func_name, arg_list)
>   SVN_ITER_ARRAY(element_type, element_name, array,
>                 iterpool, pool,
>     {
>      svn_error_t *__err = func_name arg_list;
>      if (__err->apr_err == SVN_ERR_ITER_BREAK)
>        {
>          svn_error_clear(err);
>          break;
>        }
>      SVN_ERR(__err);
>    }
>
> And I think the advantages of your SVN_ITER_ARRAY2 are:
>
>  * not taking a code block as an argument, thus avoiding the surprise
> (and possible confusion of syntax-highlighting editors etc.);
>
> and its disadvantages are:
>
>  * the body of the loop has to be expressed as a single function call,
> which adds a considerable overhead for simple operations.
>
> - Julian
>
>
> > where SVN_ITER_ARRAY() is the macro you defined:
> >
> > > #define SVN_ITER_ARRAY(element_type, element_name, array, \
> > >       iterpool_name, /* as subpool of */ pool,            \
> > >       code_block)                                         \
> > >   { apr_pool_t *iterpool_name = ...      \
> > >     for (...)                            \
> > >       {                                  \
> > >         element_type element_name = ...; \
> > >         apr_pool_clear(iterpool_name);   \
> > >         code_block                       \
> > >       }                                  \
> > >     apr_pool_destroy(iterpool_name);     \
> > >   }
> > >
> >
> > :-)
> >
> > Daniel
> >
> > > Usage:
> > >   SVN_ITER_ARRAY(svn_node_t *, node, nodes_array,
> > >                  iterpool, existing_pool,
> > >     {
> > >       if (node->kind == svn_node_file)
> > >         SVN_ERR(bar(node, blah, iterpool));
> > >       else
> > >         break;  /* breaks the iteration */
> > >     } ) /* macro ends here */
> > >
> > > Hmm...
> > >
> > > - Julian
>

While an interesting exercise in extending the C language, I've got serious
reservations about introducing these types of macros.  They don't improve
code clarity, and make it more difficult for a novice to the code to
understand what is going on.  Please think long and hard before adding these
obfuscating "features" to our code base.

-Hyrum

Reply via email to