Ludovic Courtès (2016-05-08 21:40 +0300) wrote: > Alex Kost skribis: > >> * emacs/guix-main.scm (register-package, packages-from-file): New procedures. >> (%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 ‘table’ a promise… 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… >> + (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*))))))) > > … by wrapping ‘vhash-consq’ in ‘delay’. … 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 ‘set!’ above, the options that come to mind would 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’t need 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!