bug-guix
[Top][All Lists]
Advanced

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

Re: guix-package --search


From: Ludovic Courtès
Subject: Re: guix-package --search
Date: Thu, 24 Jan 2013 22:14:12 +0100
User-agent: Gnus/5.130005 (Ma Gnus v0.5) Emacs/24.2 (gnu/linux)

Nikita Karetnikov <address@hidden> skribis:

>> Instead, you can directly build the list of matching packages, like:
>
>>   (fold-packages (lambda (package result)
>>                    (if (or (regexp-exec rx (package-synopsis package))
>>                            (regexp-exec rx (package-description package)))
>>                        (cons package result)
>>                        result))
>>                  '())
>
>> This way, only one traversal is done.
>
> 'regexp-exec' will raise an error if either 'synopsis' or 'description'
> is not a string.  That's why I wrapped it in 'false-if-exception'.

OK.

>> For i18n, we should actually use (gettext (package-description
>> package)), likewise for synopsis.  This way, that will search through
>> text in the user’s native language.
>
> I added it, but I haven't properly tested it.  Also, there is
> 'remove-duplicates' that works in the REPL.

Yes, see below.

> +(define (find-packages-by-description rx)
> +  "Search in SYNOPSIS and DESCRIPTION using RX.  Return a list of
> +matching packages."
> +  (define (remove-duplicates pred lst)
> +    ;; Remove duplicates from sorted LST using PRED.
> +    (cond ((null-list? lst)   lst)
> +          ((= (length lst) 1) lst)
> +          ((= (length lst) 2)
> +           (if (pred (first lst) (second lst)) (cdr lst) lst))
> +          ((pred (first lst) (second lst))
> +           (remove-duplicates pred (cdr lst)))
> +          (else (cons (first lst) (remove-duplicates pred (cdr lst))))))

First, can you use ‘delete-duplicates’ from (srfi srfi-1) instead?

> +  (define (same-location? p1 p2)
> +    ;; Compare locations of two packages.
> +    (eq? (package-location p1) (package-location p2)))

Here you need to use ‘equal?’, not ‘eq?’: ‘equal?’ checks for structural
equality, whereas ‘eq?’ checks for pointer equality (info "(guile) Equality").

> +  (remove-duplicates
> +   same-location?
> +   (stable-sort
> +    (fold-packages
> +     (lambda (package result)
> +       (if (or (false-if-exception
> +                (regexp-exec rx (gettext (package-synopsis package))))
> +               (false-if-exception
> +                (regexp-exec rx (gettext (package-description package)))))
> +           (cons package result)
> +           result))

Instead of ‘false-if-exception’, I’d prefer:

  (lambda (package result)
    (define matches?
      (cut regexp-exec rx <>))

    (if (or (and=> (package-synopsis package)
                   (compose matches? gettext))
            ...

Other than that it looks good to me!

Could you please also add a couple of tests in tests/guix-package.sh,
and the corresponding doc in guix.texi?

Thanks!

Ludo’.



reply via email to

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