From mboxrd@z Thu Jan 1 00:00:00 1970 From: Alex Kost Subject: Re: [PATCH 2/2] emacs: Add 'guix-package-from-file' command. Date: Mon, 09 May 2016 11:25:05 +0300 Message-ID: <87zirzocym.fsf@gmail.com> References: <1462704662-18972-1-git-send-email-alezost@gmail.com> <1462704662-18972-3-git-send-email-alezost@gmail.com> <87d1ow4clh.fsf@gnu.org> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Return-path: Received: from eggs.gnu.org ([2001:4830:134:3::10]:55606) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1azgV8-0005GV-MY for guix-devel@gnu.org; Mon, 09 May 2016 04:25:15 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1azgV2-0002BF-OY for guix-devel@gnu.org; Mon, 09 May 2016 04:25:13 -0400 List-Id: "Development of GNU Guix and the GNU System distribution." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-devel-bounces+gcggd-guix-devel=m.gmane.org@gnu.org Sender: "Guix-devel" To: Ludovic =?utf-8?Q?Court=C3=A8s?= Cc: guix-devel@gnu.org --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Ludovic Court=C3=A8s (2016-05-08 21:40 +0300) wrote: > Alex Kost skribis: > >> * emacs/guix-main.scm (register-package, packages-from-file): New proced= ures. >> (%patterns-makers): Add 'from-file' search type. >> * emacs/guix-messages.el (guix-messages): Add messages for it. >> * emacs/guix-ui-package.el (guix-package-from-file): New command. >> (guix-package-info-insert-location): Adjust for 'from-file' type. >> * doc/emacs.texi (Emacs Commands): Document it. > > [...] > >> +@item M-x guix-package-from-file >> +Display package that the code within the specified file evaluates to. >> +@xref{Invoking guix package, @code{--install-from-file}}, for an example >> +of how a file may look like. > > s/how a file/what such a file/ Fixed. >> +(define-values (package-by-address >> + register-package) >> + (let* ((table (delay (fold-packages >> + (lambda (package table) >> + (vhash-consq (object-address package) >> + package table)) >> + vlist-null))) >> + (table* (lambda () >> + (if (promise? table) >> + (force table) >> + table)))) > > It may be easier to always make =E2=80=98table=E2=80=99 a promise=E2=80=A6 I don't like this 'table*' procedure (especially its name), and I would like to get rid of it, but I couldn't make your suggestion work=E2=80=A6 >> + (values >> + (lambda (address) >> + "Return package by its object ADDRESS." >> + (match (vhash-assq address (table*)) >> + ((_ . package) package) >> + (_ #f))) >> + (lambda (package) >> + "Register PACKAGE by its 'object-address', so that later >> +'package-by-address' can be used to access it." >> + (set! table >> + (vhash-consq (object-address package) >> + package (table*))))))) > > =E2=80=A6 by wrapping =E2=80=98vhash-consq=E2=80=99 in =E2=80=98delay=E2= =80=99. =E2=80=A6 I tried it, but I got an error I don't know what to do with: Throw to key `vm-error' with args `(vm-run "VM: Stack overflow" ())'. I attach the file that illustrates this problem. Here is the recipe to reproduce it using geiser: 1. M-x run-guile 2. Open the attached file 3. Evaluate it: C-c C-b And the last expression leads to an error (at least for me). Is there some problem with combining force/delay or did I do something wrong? > To avoid =E2=80=98set!=E2=80=99 above, the options that come to mind woul= d be: > > 1. To not provide M-x guix-package-from-file and instead provide, say, > M-x guix-install-package-from-file. That way, we wouldn=E2=80=99t n= eed to > remember the package. I don't like this solution. With "M-x guix-package-from-file" you get a full-featured *Guix Package Info* buffer, where you can not only install the package, but download its source, look at its license, inputs, etc. (and soon it will be possible just to build it without installing). > 2. To thread the state, consisting mainly of lookup tables/procedures, > through the state monad, and to change the state in this particular > case. > > Converting to this new style would be quite a bit of work, for just > this one special case. Ouch, this looks scary to me, so I stay on the current solution, but thanks for the pointers! --=-=-= Content-Type: text/x-scheme Content-Disposition: attachment; filename=from-file-delay-bug.scm (use-modules (ice-9 vlist) (ice-9 match) (gnu packages) (gnu packages curl)) (define-values (package-by-address register-package) (let ((table (delay (fold-packages (lambda (package table) (vhash-consq (object-address package) package table)) vlist-null)))) (values (lambda (address) "Return package by its object ADDRESS." (match (vhash-assq address (force table)) ((_ . package) package) (_ #f))) (lambda (package) "Register PACKAGE by its 'object-address', so that later 'package-by-address' can be used to access it." (set! table (delay (vhash-consq (object-address package) package (force table)))))))) (register-package curl) ;; This expressions errors: (package-by-address (object-address curl)) --=-=-=--