lilypond-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Resolving standoffs


From: David Kastrup
Subject: Re: Resolving standoffs
Date: Tue, 14 Apr 2020 14:01:39 +0200
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/28.0.50 (gnu/linux)

Han-Wen Nienhuys <address@hidden> writes:

> In short, David is asking me to set aside my well-founded skepticism
> on his plans, so get_property can decltype to get at the type of the
> receiver, ie.
>
>   #define get_property(receiver, name) \
>      { something something (decltype)(*receiver_type) }
>
> I am concerned that the logical next step will require including the
> definitions of Music, Grob, Context etc. so the macro can actually do
> something different based on its type. This would make all of LilyPond
> depend on all of those headers, which will significantly slow down
> recompiles when working on the source code.

How about evaluating patches based on themselves rather than on future
expectations?

> If David wants to experiment to make something that compiles against
> current master, he could simply refactor the get_object/set_object()
> calls. They work exactly the same, and because the macro is already
> separate, there is no need to do a global refactoring. That wouldn't
> work to demonstrate improvements in benchmarks, but it would
> demonstrate the overall idea, so we know what we're talking about, and
> we can verify that it at least works correctly.

Obviously, we can verify that stuff works correctly with a more
encompassing patch, as well as judge the performance impacts.

> David has not mentioned two downsides to his refactoring:
>
> 1. it touches code all over the place making git-blame less useful.

Of course I have mentioned that it touches code all over the place.
That is the main reason that it is needed to facilitate parallel
development over a longer amount of time without constant rebasing.

> 2. all other pending changes become invalidated and need to be
> reorganized, including historical changes.

That is the case with every extensive change.  It hasn't kept us from
refactorings like that previously.

> In short, I see this as a poorly specified, ill-conceived plan, and to
> add insult to injury, nobody has tried to evaluate my extensive
> technical commentary on the plan at hand.

Because the plan at hand is not at debate.  At debate is a purely
syntactical change facilitating more work that does not require macros
to simulate member function overloading, a technique very unusual for
C++ and tripping up newcomers to the code.

> I also briefly wish to address Dan's point:
>
> get_property is a macro for performance reasons, but to the caller the
> distinction is invisible, and it would certainly be a member function
> if there no performance considerations.

The string-literal/variable distinction and memoization is achieved by
function overloading and the implementation of ly_scm2symbol .  More
relevant is that the macro can pass source file name and line numbers.

> This pattern is also common in the GUILE source code, for example,
> scm_is_eq looks like a function (lower case), but it is actually a
> macro for performance reasons.

That is a red herring since nobody complains about macro calls looking
like function calls: they always do.  The problem for understanding is
that this macro call looks like a member function call.

> For thinking about the readability of the source code at the caller
> side, it is better that it remains as a method.

But it isn't a method.  It is a macro.

-- 
David Kastrup



reply via email to

[Prev in Thread] Current Thread [Next in Thread]