From: ludo@gnu.org (Ludovic Courtès)
To: Federico Beffa <beffa@ieee.org>
Cc: Guix-devel <guix-devel@gnu.org>, Alex Kost <alezost@gmail.com>
Subject: Re: [PATCH 1/5] import: Add 'elpa' importer
Date: Wed, 24 Jun 2015 23:06:43 +0200 [thread overview]
Message-ID: <87381gvmsc.fsf@gnu.org> (raw)
In-Reply-To: <CAKrPhPMuLvFtQjjz1k_pxDaCk2ZJ1NHMigi-tga9bH+t6mHu2g@mail.gmail.com> (Federico Beffa's message of "Wed, 24 Jun 2015 18:15:12 +0200")
Federico Beffa <beffa@ieee.org> skribis:
> From 595befd0fb88ae00d405a727efb55b9fa456e549 Mon Sep 17 00:00:00 2001
> From: Federico Beffa <beffa@fbengineering.ch>
> Date: Tue, 16 Jun 2015 10:50:06 +0200
> Subject: [PATCH 1/5] import: Add 'elpa' importer.
>
> * guix/import/elpa.scm: New file.
> * guix/scripts/import.scm: Add "elpa" to 'importers'.
> * guix/scripts/import/elpa.scm: New file.
> * Makefile.am (MODULES): Add 'guix/import/elpa.scm' and
> 'guix/scripts/import/elpa.scm'.
> (SCM_TESTS): Add 'tests/elpa.scm'.
> * doc/guix.texi (Invoking guix import): Document it.
> * tests/elpa.scm: New file.
This looks nice! (And you were fast!)
Below are some comments essentially nitpicking about the style.
> --- a/doc/guix.texi
> +++ b/doc/guix.texi
> @@ -3770,6 +3770,33 @@ package name by a hyphen and a version number as in the following example:
> @example
> guix import hackage mtl-2.1.3.1
> @end example
> +
> +@item elpa
> +@cindex elpa
> +Import meta-data from an Emacs ELPA package repository.
Rather:
from an Emacs Lisp Package Archive (ELPA) package repository
(@pxref{Packages,,, emacs, The GNU Emacs Manual}).
> +Specific command-line options are:
> +
> +@table @code
> +@item --archive=@var{repo}
> +@itemx -a @var{repo}
> +@var{repo} identifies the archive repository from which to retrieve the
> +information. Currently the supported repositories and their identifiers
> +are:
> +@itemize -
> +@item
> +@uref{"http://elpa.gnu.org/packages", GNU}, selected by the @code{gnu}
> +identifier. This is the default.
> +
> +@item
> +@uref{"http://stable.melpa.org/packages", MELPA-Stable}, selected by the
> +@code{melpa-stable} identifier.
> +
> +@item
> +@uref{"http://melpa.org/packages", MELPA}, selected by the @code{melpa}
> +identifier.
> +@end itemize
Perhaps REPO could also be a URL, in addition to one of these identifiers?
> +(define (elpa-dependencies->names deps)
> + "Convert the list of dependencies from the ELPA format, to a list of string
> +names."
What about:
Convert DEPS, a list of foobars à la ELPA, to a list of package names
as strings.
> + (map (lambda (d) (symbol->string (first d))) deps))
(match deps
(((names _ ...) ...)
(map symbol->string names)))
> +(define (filter-dependencies names)
> + "Remove the package names included with Emacs from the list of
> +NAMES (strings)."
> + (let ((emacs-standard-libraries
> + '("emacs" "cl-lib")))
> + (filter (lambda (d) (not (member d emacs-standard-libraries)))
> + names)))
In general I think it’s best to give the predicate a name, and to not
define a ‘filter-xxx’ or ‘remove-xxx’ function. So:
(define emacs-standard-library?
(let ((libs '("emacs" "cl-lib")))
(lambda (lib)
"Return true if ..."
(member lib libs))))
and then:
(filter emacs-standard-library? names)
wherever needed.
> +(define* (elpa-url #:optional (repo "gnu"))
I would rather use a symbol for REPO.
> +;; Fetch URL, store the content in a temporary file and call PROC with that
> +;; file.
> +(define fetch-and-call-with-input-file
> + (memoize
> + (lambda* (url proc #:optional (err-msg "unavailable"))
> + (call-with-temporary-output-file
> + (lambda (temp port)
> + (or (and (url-fetch url temp)
> + (call-with-input-file temp proc))
> + err-msg))))))
Make the comment a docstring below ‘lambda*’.
I would call it ‘call-with-downloaded-file’ for instance. But then
memoization should be moved elsewhere, because that’s not one would
expect from a procedure with this name.
The return value must also be documented. Returning an error message is
not an option IMO, because the caller could hardly distinguish it from a
“normal” return value, and because that’s a very unusual convention.
Probably an error condition should be raised?
> +(define* (elpa-package-info name #:optional (repo "gnu"))
> + "Extract the information about the package NAME from the package archieve of
> +REPO."
> + (let* ((archive (elpa-fetch-archive repo))
> + (info (filter (lambda (p) (eq? (first p) (string->symbol name)))
> + (cdr archive))))
> + (if (pair? info) (first info) #f)))
Give the predicate a name, and rather use ‘match’.
> +(define (lookup-extra alist key)
> + "Lookup KEY from the ALIST extra package information."
> + (assq-ref alist key))
Use ‘assq-ref’ directly.
> +(define (package-home-page alist)
> + "Extract the package home-page from ALIST."
> + (or (lookup-extra alist ':url) "unspecified"))
Maybe use the ‘elpa-package’ prefix instead of ‘package’ for procedures
like this one that expect an ELPA-package-as-an-alist?
> +(define (nil->empty alist)
> + "If ALIST is the symbol 'nil return the empty list. Otherwise, return ALIST."
Rather ‘ensure-list’.
Thank you!
Ludo’.
next prev parent reply other threads:[~2015-06-24 21:06 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-06-21 8:28 [PATCH 1/5] import: Add 'elpa' importer Federico Beffa
2015-06-21 20:39 ` Alex Kost
2015-06-24 16:15 ` Federico Beffa
2015-06-24 21:06 ` Ludovic Courtès [this message]
2015-06-25 18:33 ` Federico Beffa
2015-06-27 8:13 ` Federico Beffa
2015-06-27 10:08 ` Ludovic Courtès
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://guix.gnu.org/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87381gvmsc.fsf@gnu.org \
--to=ludo@gnu.org \
--cc=alezost@gmail.com \
--cc=beffa@ieee.org \
--cc=guix-devel@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/guix.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).