* Simplifications enabled by switching to 'invoke'
[not found] ` <20180124010803.590AF2068F@vcs0.savannah.gnu.org>
@ 2018-01-24 12:06 ` Mark H Weaver
2018-01-24 12:14 ` question regarding substitute* and #t (was: Simplifications enabled by switching to 'invoke') Andy Wingo
0 siblings, 1 reply; 13+ messages in thread
From: Mark H Weaver @ 2018-01-24 12:06 UTC (permalink / raw)
To: Kei Kebreau; +Cc: guix-devel
Hello Kei, and other fellow Guix,
kkebreau@posteo.net (Kei Kebreau) writes:
> commit 0af6ffdd8d81f86a232902a54f99d4cfcd369490
> Author: Kei Kebreau <kkebreau@posteo.net>
> Date: Tue Jan 23 17:44:53 2018 -0500
>
> gnu: qscintilla: Update to 2.10.2.
>
> * gnu/packages/qt.scm (qscintilla, python-qscintilla, python-pyqt+qscintilla):
> Update to 2.10.2.
[...]
> @@ -1715,8 +1715,8 @@ indicators, code completion and call tips.")
> (replace 'configure
> (lambda* (#:key outputs configure-flags #:allow-other-keys)
> (chdir "Python")
> - (and (zero? (apply system* "python3" "configure.py"
> - configure-flags))
> + (and (apply invoke "python3" "configure.py"
> + configure-flags)
> ;; Install to the right directory
> (begin
> (substitute* '("Makefile"
Kei, I appreciate that you took this opportunity to switch from
'system*' to 'invoke' here while doing this update. I think it makes
sense to do this whenever we update a package.
However, it's worth noting that you missed an important further
simplification that the switch to 'invoke' enables. Since 'invoke'
never returns #false, the surrounding code that arranges for plumbing of
its result code can be removed entirely.
Step by step:
* Since 'invoke' never returns #false, it can be moved above the 'and'.
* This leaves the 'and' with only one remaining argument. An 'and' with
only one argument is equivalent to that argument, so the 'and' can be
removed, replaced by its argument.
* Since the 'begin' is now within a body (whereas previously it was an
operand), the 'begin' can now be removed, replaced by its contents.
This is what I did in commit 76c7fc436a151236f5e1ff966fd99172d85ee422 on
master, which I've attached below.
Thanks,
Mark
From 76c7fc436a151236f5e1ff966fd99172d85ee422 Mon Sep 17 00:00:00 2001
From: Mark H Weaver <mhw@netris.org>
Date: Wed, 24 Jan 2018 06:35:29 -0500
Subject: [PATCH] gnu: python-qscintilla: Remove result code plumbing.
* gnu/packages/qt.scm (python-qscintilla)[arguments]: In the 'configure'
phase, remove result code plumbing that is no longer needed, since 'invoke'
never returns #false.
---
gnu/packages/qt.scm | 17 ++++++++---------
1 file changed, 8 insertions(+), 9 deletions(-)
diff --git a/gnu/packages/qt.scm b/gnu/packages/qt.scm
index 596006080..34938b9c0 100644
--- a/gnu/packages/qt.scm
+++ b/gnu/packages/qt.scm
@@ -1715,15 +1715,14 @@ indicators, code completion and call tips.")
(replace 'configure
(lambda* (#:key outputs configure-flags #:allow-other-keys)
(chdir "Python")
- (and (apply invoke "python3" "configure.py"
- configure-flags)
- ;; Install to the right directory
- (begin
- (substitute* '("Makefile"
- "Qsci/Makefile")
- (("\\$\\(INSTALL_ROOT\\)/gnu/store/[^/]+")
- (assoc-ref outputs "out")))
- #t)))))))
+ (apply invoke "python3" "configure.py"
+ configure-flags)
+ ;; Install to the right directory
+ (substitute* '("Makefile"
+ "Qsci/Makefile")
+ (("\\$\\(INSTALL_ROOT\\)/gnu/store/[^/]+")
+ (assoc-ref outputs "out")))
+ #t)))))
(inputs
`(("qscintilla" ,qscintilla)
("python" ,python)
--
2.16.1
^ permalink raw reply related [flat|nested] 13+ messages in thread
* question regarding substitute* and #t (was: Simplifications enabled by switching to 'invoke')
2018-01-24 12:06 ` Simplifications enabled by switching to 'invoke' Mark H Weaver
@ 2018-01-24 12:14 ` Andy Wingo
2018-01-24 13:28 ` question regarding substitute* and #t Mark H Weaver
2018-01-24 14:45 ` Hartmut Goebel
0 siblings, 2 replies; 13+ messages in thread
From: Andy Wingo @ 2018-01-24 12:14 UTC (permalink / raw)
To: Mark H Weaver; +Cc: guix-devel
Hi!
On Wed 24 Jan 2018 13:06, Mark H Weaver <mhw@netris.org> writes:
> + ;; Install to the right directory
> + (substitute* '("Makefile"
> + "Qsci/Makefile")
> + (("\\$\\(INSTALL_ROOT\\)/gnu/store/[^/]+")
> + (assoc-ref outputs "out")))
> + #t)))))
I guess once we switch over all instances of "system" and "system*" to
use invoke, does that mean we will also be able to remove these
vestigial "#t" returns?
Andy
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: question regarding substitute* and #t
2018-01-24 12:14 ` question regarding substitute* and #t (was: Simplifications enabled by switching to 'invoke') Andy Wingo
@ 2018-01-24 13:28 ` Mark H Weaver
2018-01-24 15:20 ` Andy Wingo
2018-01-25 8:31 ` Arun Isaac
2018-01-24 14:45 ` Hartmut Goebel
1 sibling, 2 replies; 13+ messages in thread
From: Mark H Weaver @ 2018-01-24 13:28 UTC (permalink / raw)
To: Andy Wingo; +Cc: guix-devel
Hi Andy,
Andy Wingo <wingo@igalia.com> writes:
> On Wed 24 Jan 2018 13:06, Mark H Weaver <mhw@netris.org> writes:
>
>> + ;; Install to the right directory
>> + (substitute* '("Makefile"
>> + "Qsci/Makefile")
>> + (("\\$\\(INSTALL_ROOT\\)/gnu/store/[^/]+")
>> + (assoc-ref outputs "out")))
>> + #t)))))
>
> I guess once we switch over all instances of "system" and "system*" to
> use invoke, does that mean we will also be able to remove these
> vestigial "#t" returns?
After we switch to using 'invoke' everywhere, or more precisely, after
we arrange to never return #false from any phase or snippet, then there
should be one more step before removing the vestigial #true returns: we
should change the code that calls phases or snippets to ignore the
value(s) returned by those procedures. When that is done, then the #t's
will truly be vestigial. Does that make sense?
Mark
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: question regarding substitute* and #t
2018-01-24 12:14 ` question regarding substitute* and #t (was: Simplifications enabled by switching to 'invoke') Andy Wingo
2018-01-24 13:28 ` question regarding substitute* and #t Mark H Weaver
@ 2018-01-24 14:45 ` Hartmut Goebel
2018-01-24 15:27 ` Andy Wingo
1 sibling, 1 reply; 13+ messages in thread
From: Hartmut Goebel @ 2018-01-24 14:45 UTC (permalink / raw)
To: guix-devel
Am 24.01.2018 um 13:14 schrieb Andy Wingo:
> On Wed 24 Jan 2018 13:06, Mark H Weaver <mhw@netris.org> writes:
>
>> + ;; Install to the right directory
>> + (substitute* '("Makefile"
>> + "Qsci/Makefile")
>> + (("\\$\\(INSTALL_ROOT\\)/gnu/store/[^/]+")
>> + (assoc-ref outputs "out")))
>> + #t)))))
> I guess once we switch over all instances of "system" and "system*" to
> use invoke, does that mean we will also be able to remove these
> vestigial "#t" returns?
I wonder why substitute* not simply returns #t?!
--
Regards
Hartmut Goebel
| Hartmut Goebel | h.goebel@crazy-compilers.com |
| www.crazy-compilers.com | compilers which you thought are impossible |
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: question regarding substitute* and #t
2018-01-24 13:28 ` question regarding substitute* and #t Mark H Weaver
@ 2018-01-24 15:20 ` Andy Wingo
2018-01-24 21:09 ` Kei Kebreau
2018-01-25 5:31 ` Maxim Cournoyer
2018-01-25 8:31 ` Arun Isaac
1 sibling, 2 replies; 13+ messages in thread
From: Andy Wingo @ 2018-01-24 15:20 UTC (permalink / raw)
To: Mark H Weaver; +Cc: guix-devel
On Wed 24 Jan 2018 14:28, Mark H Weaver <mhw@netris.org> writes:
> Andy Wingo <wingo@igalia.com> writes:
>
>> On Wed 24 Jan 2018 13:06, Mark H Weaver <mhw@netris.org> writes:
>>
>>> + ;; Install to the right directory
>>> + (substitute* '("Makefile"
>>> + "Qsci/Makefile")
>>> + (("\\$\\(INSTALL_ROOT\\)/gnu/store/[^/]+")
>>> + (assoc-ref outputs "out")))
>>> + #t)))))
>>
>> I guess once we switch over all instances of "system" and "system*" to
>> use invoke, does that mean we will also be able to remove these
>> vestigial "#t" returns?
>
> After we switch to using 'invoke' everywhere, or more precisely, after
> we arrange to never return #false from any phase or snippet, then there
> should be one more step before removing the vestigial #true returns: we
> should change the code that calls phases or snippets to ignore the
> value(s) returned by those procedures. When that is done, then the #t's
> will truly be vestigial. Does that make sense?
Sure, makes sense. Thanks for thinking it through with me :)
Andy
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: question regarding substitute* and #t
2018-01-24 14:45 ` Hartmut Goebel
@ 2018-01-24 15:27 ` Andy Wingo
2018-01-24 22:10 ` Ricardo Wurmus
0 siblings, 1 reply; 13+ messages in thread
From: Andy Wingo @ 2018-01-24 15:27 UTC (permalink / raw)
To: Hartmut Goebel; +Cc: guix-devel
On Wed 24 Jan 2018 15:45, Hartmut Goebel <h.goebel@crazy-compilers.com> writes:
> Am 24.01.2018 um 13:14 schrieb Andy Wingo:
>> On Wed 24 Jan 2018 13:06, Mark H Weaver <mhw@netris.org> writes:
>>
>>> + ;; Install to the right directory
>>> + (substitute* '("Makefile"
>>> + "Qsci/Makefile")
>>> + (("\\$\\(INSTALL_ROOT\\)/gnu/store/[^/]+")
>>> + (assoc-ref outputs "out")))
>>> + #t)))))
>> I guess once we switch over all instances of "system" and "system*" to
>> use invoke, does that mean we will also be able to remove these
>> vestigial "#t" returns?
> I wonder why substitute* not simply returns #t?!
There was a proposal to make it return #t! However then someone pointed
out that actually instead of making phases return boolean results, we
should instead signal problems via exceptions, and that drove the shift
from system / system* to invoke. In the future world where completion
means success, it doesn't matter what substitute* returns.
However! Because it doesn't matter, perhaps in the interest of
transition we should make substitute* return #t, so that once we switch
to the new exception-based error signalling, that we have less code to
clean up later.
Andy
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: question regarding substitute* and #t
2018-01-24 15:20 ` Andy Wingo
@ 2018-01-24 21:09 ` Kei Kebreau
2018-01-25 5:31 ` Maxim Cournoyer
1 sibling, 0 replies; 13+ messages in thread
From: Kei Kebreau @ 2018-01-24 21:09 UTC (permalink / raw)
To: Andy Wingo; +Cc: guix-devel
[-- Attachment #1: Type: text/plain, Size: 1226 bytes --]
Andy Wingo <wingo@igalia.com> writes:
> On Wed 24 Jan 2018 14:28, Mark H Weaver <mhw@netris.org> writes:
>
>> Andy Wingo <wingo@igalia.com> writes:
>>
>>> On Wed 24 Jan 2018 13:06, Mark H Weaver <mhw@netris.org> writes:
>>>
>>>> + ;; Install to the right directory
>>>> + (substitute* '("Makefile"
>>>> + "Qsci/Makefile")
>>>> + (("\\$\\(INSTALL_ROOT\\)/gnu/store/[^/]+")
>>>> + (assoc-ref outputs "out")))
>>>> + #t)))))
>>>
>>> I guess once we switch over all instances of "system" and "system*" to
>>> use invoke, does that mean we will also be able to remove these
>>> vestigial "#t" returns?
>>
>> After we switch to using 'invoke' everywhere, or more precisely, after
>> we arrange to never return #false from any phase or snippet, then there
>> should be one more step before removing the vestigial #true returns: we
>> should change the code that calls phases or snippets to ignore the
>> value(s) returned by those procedures. When that is done, then the #t's
>> will truly be vestigial. Does that make sense?
>
> Sure, makes sense. Thanks for thinking it through with me :)
>
> Andy
Thanks to you both for this thread!
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 832 bytes --]
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: question regarding substitute* and #t
2018-01-24 15:27 ` Andy Wingo
@ 2018-01-24 22:10 ` Ricardo Wurmus
0 siblings, 0 replies; 13+ messages in thread
From: Ricardo Wurmus @ 2018-01-24 22:10 UTC (permalink / raw)
To: Andy Wingo; +Cc: guix-devel
Andy Wingo <wingo@igalia.com> writes:
>> I wonder why substitute* not simply returns #t?!
>
> There was a proposal to make it return #t! However then someone pointed
> out that actually instead of making phases return boolean results, we
> should instead signal problems via exceptions, and that drove the shift
> from system / system* to invoke. In the future world where completion
> means success, it doesn't matter what substitute* returns.
There is also the question what it means for substitute* to fail. Does
it fail when one of the substitutions couldn’t be performed in one of
the files? Or does it only fail when no substitutions succeeded? Or
something in between?
I’m sure we have a bunch of places in package definitions where old
substitions actually no longer apply to current versions of the sources.
Cleaning this up will take quite some time.
(I think that it would be helpful if substitute* failed when any
substitution failed, but this would make some shortcuts impossible.)
--
Ricardo
GPG: BCA6 89B6 3655 3801 C3C6 2150 197A 5888 235F ACAC
https://elephly.net
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: question regarding substitute* and #t
2018-01-24 15:20 ` Andy Wingo
2018-01-24 21:09 ` Kei Kebreau
@ 2018-01-25 5:31 ` Maxim Cournoyer
2018-01-25 7:51 ` Andy Wingo
1 sibling, 1 reply; 13+ messages in thread
From: Maxim Cournoyer @ 2018-01-25 5:31 UTC (permalink / raw)
To: Andy Wingo; +Cc: guix-devel
Andy Wingo <wingo@igalia.com> writes:
> On Wed 24 Jan 2018 14:28, Mark H Weaver <mhw@netris.org> writes:
>
>> Andy Wingo <wingo@igalia.com> writes:
>>
>>> On Wed 24 Jan 2018 13:06, Mark H Weaver <mhw@netris.org> writes:
>>>
>>>> + ;; Install to the right directory
>>>> + (substitute* '("Makefile"
>>>> + "Qsci/Makefile")
>>>> + (("\\$\\(INSTALL_ROOT\\)/gnu/store/[^/]+")
>>>> + (assoc-ref outputs "out")))
>>>> + #t)))))
>>>
>>> I guess once we switch over all instances of "system" and "system*" to
>>> use invoke, does that mean we will also be able to remove these
>>> vestigial "#t" returns?
>>
>> After we switch to using 'invoke' everywhere, or more precisely, after
>> we arrange to never return #false from any phase or snippet, then there
>> should be one more step before removing the vestigial #true returns: we
>> should change the code that calls phases or snippets to ignore the
>> value(s) returned by those procedures. When that is done, then the #t's
>> will truly be vestigial. Does that make sense?
>
> Sure, makes sense. Thanks for thinking it through with me :)
>
> Andy
Where does this `invoke' comes from? Geiser is unhelpful at finding it,
and it doesn't seem to be documented in the Guile Reference?
Thanks,
Maxim
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: question regarding substitute* and #t
2018-01-25 5:31 ` Maxim Cournoyer
@ 2018-01-25 7:51 ` Andy Wingo
2018-01-26 3:53 ` Maxim Cournoyer
0 siblings, 1 reply; 13+ messages in thread
From: Andy Wingo @ 2018-01-25 7:51 UTC (permalink / raw)
To: Maxim Cournoyer; +Cc: guix-devel
On Thu 25 Jan 2018 06:31, Maxim Cournoyer <maxim.cournoyer@gmail.com> writes:
> Where does this `invoke' comes from? Geiser is unhelpful at finding it,
> and it doesn't seem to be documented in the Guile Reference?
https://lists.gnu.org/archive/html/guix-devel/2018-01/msg00163.html
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: question regarding substitute* and #t
2018-01-24 13:28 ` question regarding substitute* and #t Mark H Weaver
2018-01-24 15:20 ` Andy Wingo
@ 2018-01-25 8:31 ` Arun Isaac
2018-01-25 20:02 ` Mark H Weaver
1 sibling, 1 reply; 13+ messages in thread
From: Arun Isaac @ 2018-01-25 8:31 UTC (permalink / raw)
To: Mark H Weaver, Andy Wingo; +Cc: guix-devel
Mark H Weaver <mhw@netris.org> writes:
> After we switch to using 'invoke' everywhere, or more precisely, after
> we arrange to never return #false from any phase or snippet, then
> there should be one more step before removing the vestigial #true
> returns: we should change the code that calls phases or snippets to
> ignore the value(s) returned by those procedures. When that is done,
> then the #t's will truly be vestigial. Does that make sense?
I think we should start removing the vestigial #true right away. Why
wait until we can make the code that calls phases ignore the values
returned by those phases? As it stands, that code errors out only when a
phase returns #false, not when it returns any other value (even
unspecified). WDYT?
The #true is already vestigial. In fact, #true being vestigial is what
annoyed me and made me start the original thread discussing ways to get
rid of it.
https://lists.gnu.org/archive/html/guix-devel/2017-12/msg00235.html
And, it so happened that we concluded the best way to go forward was to
deprecate boolean results altogether and transition to an exception
based system.
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: question regarding substitute* and #t
2018-01-25 8:31 ` Arun Isaac
@ 2018-01-25 20:02 ` Mark H Weaver
0 siblings, 0 replies; 13+ messages in thread
From: Mark H Weaver @ 2018-01-25 20:02 UTC (permalink / raw)
To: Arun Isaac; +Cc: guix-devel
Arun Isaac <arunisaac@systemreboot.net> writes:
> Mark H Weaver <mhw@netris.org> writes:
>
>> After we switch to using 'invoke' everywhere, or more precisely, after
>> we arrange to never return #false from any phase or snippet, then
>> there should be one more step before removing the vestigial #true
>> returns: we should change the code that calls phases or snippets to
>> ignore the value(s) returned by those procedures. When that is done,
>> then the #t's will truly be vestigial. Does that make sense?
>
> I think we should start removing the vestigial #true right away. Why
> wait until we can make the code that calls phases ignore the values
> returned by those phases? As it stands, that code errors out only when a
> phase returns #false, not when it returns any other value (even
> unspecified). WDYT?
>
> The #true is already vestigial.
They are not vestigial if we care about code correctness.
Phases and snippets are currently specified to return a boolean, and
furthermore we must return the _appropriate_ boolean to indicate success
for failure. I consider it unacceptable to not bother returning
anything, allowing a completely unspecified value to be returned, and
think that this is okay because it happens to work, for now, because of
an internal implementation detail of Guile.
This (unfortunately widespread) practice of sloppiness in software
engineering is how we ended up in the mess we are in today, where our
software is drowning in bugs and our systems are hopelessly insecure.
Let the annoyance that you and others feel about these unsightly #t's
supply the motivation to fix this issue properly.
Mark
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: question regarding substitute* and #t
2018-01-25 7:51 ` Andy Wingo
@ 2018-01-26 3:53 ` Maxim Cournoyer
0 siblings, 0 replies; 13+ messages in thread
From: Maxim Cournoyer @ 2018-01-26 3:53 UTC (permalink / raw)
To: Andy Wingo; +Cc: guix-devel
Andy Wingo <wingo@igalia.com> writes:
> On Thu 25 Jan 2018 06:31, Maxim Cournoyer <maxim.cournoyer@gmail.com> writes:
>
>> Where does this `invoke' comes from? Geiser is unhelpful at finding it,
>> and it doesn't seem to be documented in the Guile Reference?
>
> https://lists.gnu.org/archive/html/guix-devel/2018-01/msg00163.html
OK, so `invoke' is defined in (guix build utils), and it's docstring is:
"Invoke PROGRAM with the given ARGS. Raise an error if the exit code
is non-zero; otherwise return #t."
Thanks,
Maxim
^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2018-01-26 3:53 UTC | newest]
Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <20180124010802.18874.3012@vcs0.savannah.gnu.org>
[not found] ` <20180124010803.590AF2068F@vcs0.savannah.gnu.org>
2018-01-24 12:06 ` Simplifications enabled by switching to 'invoke' Mark H Weaver
2018-01-24 12:14 ` question regarding substitute* and #t (was: Simplifications enabled by switching to 'invoke') Andy Wingo
2018-01-24 13:28 ` question regarding substitute* and #t Mark H Weaver
2018-01-24 15:20 ` Andy Wingo
2018-01-24 21:09 ` Kei Kebreau
2018-01-25 5:31 ` Maxim Cournoyer
2018-01-25 7:51 ` Andy Wingo
2018-01-26 3:53 ` Maxim Cournoyer
2018-01-25 8:31 ` Arun Isaac
2018-01-25 20:02 ` Mark H Weaver
2018-01-24 14:45 ` Hartmut Goebel
2018-01-24 15:27 ` Andy Wingo
2018-01-24 22:10 ` Ricardo Wurmus
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/guix.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.