Re: [PATCH v3 2/4] grep/pcre2: simplify boolean spaghetti
- From
Johannes Sixt <j6t@kdbg.org>
- Date
- Jan 24, 2021, 10:45 UTC
- Message-ID
- <ac4f3b95-49f7-7a90-b7f7-9efbb57a7392@kdbg.org>
- In-Reply-To
- <xmqqim7m292j.fsf@gitster.c.googlers.com>
Am 24.01.21 um 06:33 schrieb Junio C Hamano:
Show 17 quoted lines
> Ævar Arnfjörð Bjarmason <avarab@gmail.com> writes: > >> NOT(A && B) is Equivalent to (NOT(A) OR NOT(B)) > > At this level, however, the left one looks much simpler than the > right one ;-) > > >> if (!opt->ignore_locale && is_utf8_locale() && has_non_ascii(p->pattern) && >> - !(!opt->ignore_case && (p->fixed || p->is_fixed))) >> + (opt->ignore_case || !(p->fixed || p->is_fixed))) >> options |= PCRE2_UTF; > > In the context of this expression, well, I guess the rewritten one > is probably simpler but can we explain the whole condition in fewer > than three lines? With or without the rewrite, it still looks too > complicated to me.
Make the condition
if (!opt->ignore_locale &&
is_utf8_locale() &&
has_non_ascii(p->pattern) &&
(opt->ignore_case ||
(!p->fixed &&
!p->is_fixed)))
{
options |= PCRE2_UTF;
}With the knowledge of the equivalence
(A => B) <=> (NOT(A) OR B)
(A => B means "if A then B"), the condition makes a lot of sense when read aloud:
if
NOT ignore locale
AND
is UTF8
AND
has non-ASCII
AND
if
NOT ignore case
then if also
NOT fixed
AND
NOT is fixed
then
...The codition amounts to extending a series of conjunctions with more conjuctions IF a condition is satisfied. That's quite sensible.
You have to swap the polarity of the first condition of || in your head, though, to achieve that meaning. That works with every OR condition, BTW.
-- Hannes