From mboxrd@z Thu Jan 1 00:00:00 1970 From: Andy Wingo Subject: Re: Why should build phases not return unspecified values? Date: Mon, 18 Dec 2017 10:40:00 +0100 Message-ID: <87mv2gqsr3.fsf@igalia.com> References: Mime-Version: 1.0 Content-Type: text/plain Return-path: Received: from eggs.gnu.org ([2001:4830:134:3::10]:54123) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eQru7-0001FO-T5 for guix-devel@gnu.org; Mon, 18 Dec 2017 04:40:13 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eQru4-0001kV-P8 for guix-devel@gnu.org; Mon, 18 Dec 2017 04:40:11 -0500 Received: from pb-sasl2.pobox.com ([64.147.108.67]:63776 helo=sasl.smtp.pobox.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1eQru4-0001kF-KY for guix-devel@gnu.org; Mon, 18 Dec 2017 04:40:08 -0500 In-Reply-To: (Arun Isaac's message of "Sun, 17 Dec 2017 04:58:15 +0530") 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: Arun Isaac Cc: guix-devel@gnu.org On Sun 17 Dec 2017 00:28, Arun Isaac writes: > Whenever we have a build phase that ends with a call (for example, to > substitute, chdir, symlink, etc) that returns an unspecified value, we > append a #t so that the return value is a boolean. However, the build > system, as it stands currently, does not mind an unspecified value, and > treats it as a success. As a result, forgetting to add a #t at the end > of custom phases is a common mistake. To fix this, I have submitted a > patch at https://debbugs.gnu.org/cgi/bugreport.cgi?bug=29745 that > modifies the build system to reject unspecified values as > failures. > > However, IMO, the addition of #t at the end of certain phases, does not > contribute anything of value and we should simply be at peace with > phases returning unspecified values. Am I missing something here? I agree entirely. IMO the continuation of a build phase should be: (define build-phase-cont (case-lambda (() #t) ((ret . _) (and ret #t)))) I.e. the phase could return 0 values, that's fine, we count as success. Quite possible if your build phase ends up tail-calling to some procedure you don't care about which returns 0 values for its own reasons (arguably nicer than returning "the unspecified value", blah); currently this doesn't work though. Similarly for build phases that return more than 1 value; extra values should be ignored (this is currently the case). Making a build phase return a single boolean value in a language like Scheme is busy-work IMO. Andy