Alex Kost <alez...@gmail.com> writes: > John Darrington (2016-09-17 12:11 +0200) wrote: > >> On Sat, Sep 17, 2016 at 05:38:26PM +0800, Alex Vong wrote: > [...] >> > > + "contrib/mmuegel" "devtools/bin/configure.sh") >> > > + (("/bin/sh") (which "bash"))) >> > > + >> > > + (substitute* "devtools/bin/Build" >> > > + (("SHELL=/bin/sh") (string-append "SHELL=" (which "bash")))) >> > > + #t)) >> > I think the `#t' is not neccessary here, since `substitute*' uses >> > `substitute', which will either return #t or throw an exception. >> > >> > WTF?? Didn't you complain earlier this week when I *didn't* put #t in >> > exactly this >> > scenario?? >> > >> Yes, I am a different Alex :) >> Also, it seems we are not being consistent here, sometimes we put `#t' >> after `substitute*', sometimes we don't. Anyone has an idea? >> >> I did raise some suggestions in my earlier posts. But again I don't >> have any strong >> opinion. > > I have a strong opinion: if a docstring of a procedure says what value > it returns, we can rely on it, otherwise we should not guess what value > will be returned. In case of 'substitute*' (and 'substitute'), the > returned value is not specified, so I think if a phase ends with > 'substitute*', we should (or even must) add #t after it.
I see your point that one should not be relying on undocumented features, which I agree. But I also see an alternative: to make 'substitute*' either return true or throw an exception and document it. I think the heart of the problem is scheme is "untyped", so we rely on the documentation. What do you think?