From mboxrd@z Thu Jan 1 00:00:00 1970 From: ludo@gnu.org (Ludovic =?utf-8?Q?Court=C3=A8s?=) Subject: Re: Mysterious error while refactoring guix/scripts/system.scm Date: Mon, 29 Aug 2016 17:53:03 +0200 Message-ID: <87k2ezzi5c.fsf@gnu.org> References: <87wpjxhx7z.fsf@gmail.com> <87poppq85f.fsf@igalia.com> <8737md3x5a.fsf@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Return-path: Received: from eggs.gnu.org ([2001:4830:134:3::10]:44622) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1beOs4-0004nX-Fw for guix-devel@gnu.org; Mon, 29 Aug 2016 11:53:13 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1beOs0-0006mo-Ao for guix-devel@gnu.org; Mon, 29 Aug 2016 11:53:11 -0400 In-Reply-To: <8737md3x5a.fsf@gmail.com> (Chris Marusich's message of "Wed, 10 Aug 2016 00:23:29 -0700") 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: Chris Marusich Cc: guix-devel@gnu.org Hi Chris, and sorry for the delay! Chris Marusich skribis: > Backtrace: > In ice-9/boot-9.scm: > 157: 15 [catch #t # ...] > In unknown file: > ?: 14 [apply-smob/1 #] > In ice-9/boot-9.scm: > 63: 13 [call-with-prompt prompt0 ...] > In ice-9/eval.scm: > 432: 12 [eval # #] > In ice-9/boot-9.scm: > 2401: 11 [save-module-excursion #] > 4050: 10 [#] > 1724: 9 [%start-stack load-stack ...] > 1729: 8 [#] > In unknown file: > ?: 7 [primitive-load "/root/guix/scripts/guix"] > In guix/ui.scm: > 1209: 6 [run-guix-command system "list-generations"] > In ice-9/boot-9.scm: > 157: 5 [catch srfi-34 # ...] > 157: 4 [catch system-error ...] > In guix/scripts/system.scm: > 884: 3 [#] > 818: 2 [process-command list-generations () ...] > In guix/store.scm: > 1182: 1 [run-with-store # ...] > In unknown file: > ?: 0 [# #] > > ERROR: In procedure #: > ERROR: Wrong type to apply: # This means that we=E2=80=99re trying to invoke #, but # is not a procedure. Note that this is from within =E2=80=98run-to-store=E2=80=99, which is the = procedure to =E2=80=9Crun=E2=80=9D a monadic value. So in effect, what happened is equi= valent to: --8<---------------cut here---------------start------------->8--- scheme@(guile-user)> ,use(guix monads) scheme@(guile-user)> ,use(guix store) scheme@(guile-user)> (with-store s (run-with-store s *unspecified*)) ERROR: In procedure #: ERROR: Wrong type to apply: # --8<---------------cut here---------------end--------------->8--- The bug here is in fact a type error: =E2=80=98run-with-store=E2=80=99 expe= ct a monadic value, but what we have here is a regular value. To =E2=80=9Cfix=E2=80=9D it, we need: --8<---------------cut here---------------start------------->8--- scheme@(guile-user)> (with-store s (run-with-store s (with-monad %store-monad (return *unspecified*)))) --8<---------------cut here---------------end--------------->8--- =E2=80=A6 where =E2=80=98return=E2=80=99 procedure a monadic value from a n= ormal value. In your case, =E2=80=98list-generations=E2=80=99 is not a monadic procedure= (a procedure that returns a monadic value), so in this patch: (run-with-store store =E2=80=A6 (list-generations)) =E2=80=A6 triggers this very type error. I imagine this may be more than you wanted to learn. ;-) Monads in a dynamically typed setting are kinda annoying because of this. > (define (process-command command args opts) > "Process COMMAND, one of the 'guix system' sub-commands. ARGS is its > argument list and OPTS is the option alist." > - (case command > - ((list-generations) > - ;; List generations. No need to connect to the daemon, etc. > - (let ((pattern (match args > - (() "") > - ((pattern) pattern) > - (x (leave (_ "wrong number of arguments~%")))))) > - (list-generations pattern))) > - (else > - (process-action command args opts)))) > + (with-store store > + (set-build-options-from-command-line store opts) > + > + (run-with-store store > + (mbegin %store-monad > + (set-guile-for-build (default-guile)) > + (case command > + ((list-generations) > + (let ((pattern (match args > + (() "") > + ((pattern) pattern) > + (x (leave (_ "wrong number of arguments~%"))= )))) > + (list-generations pattern))) > + (else > + (process-action command args opts)))) > + #:system (assoc-ref opts 'system)))) As the comment above suggests, the idea here was to avoid connecting to the daemon for operations that do not need it, such as =E2=80=98list-generations=E2=80=99. I think we should preserve this proper= ty. Thanks for your work! I=E2=80=99m sorry this is more painful than I though= t. :-/ Ludo=E2=80=99.