Subject: Re: [bug#39258] [PATCH 1/4] ui: Cut off search early if any regexp does not match.

From: Ludovic Courtès <[email-masked]>
Date: Tue, 09 Jun 2020 10:29:14 +0200

Hi Arun,

Arun Isaac <[email-masked]> skribis:

> * guix/ui.scm (relevance): When one of the regexps does not match, cut off
> early and return 0. Do not try to match the remaining regexps.

Good catch, LGTM!

> diff --git a/guix/ui.scm b/guix/ui.scm
> index ea5f460865..4a22358963 100644
> --- a/guix/ui.scm
> +++ b/guix/ui.scm
> @@ -1519,11 +1519,16 @@ score, the more relevant OBJ is to REGEXPS."
>                      (+ relevance (* weight (apply + (map score-regexp lst)))))))))
>              0 metrics)))
>  
> -  (let ((scores (map regexp->score regexps)))
> -    ;; Return zero if one of REGEXPS doesn't match.
> -    (if (any zero? scores)
> -        0
> -        (reduce + 0 scores))))
> +  (let loop ((regexps regexps)
> +             (total-score 0))
> +    (match regexps
> +      ((head . tail)
> +       (let ((score (regexp->score head)))
> +         ;; Return zero if one of PATTERNS doesn't match.
> +         (cond
> +          ((zero? score) 0)
> +          (else (loop tail (+ total-score score))))))

You can use ‘if’ since there are only two arms.

Thanks,
Ludo’.