GNU bug report logs -
#13865
redefinition of +
Previous Next
Reported by: Ian Price <ianprice90 <at> googlemail.com>
Date: Mon, 4 Mar 2013 00:44:01 UTC
Severity: normal
Tags: notabug
Done: ludo <at> gnu.org (Ludovic Courtès)
Bug is archived. No further changes may be made.
Full log
Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):
Hi guys,
On #guile, euiuer (CCed) reported this, though he was to shy to report
this himself. In guile 1.8.7
<euiuer> (define (foo) (+ 1 1))
<euiuer> (define (+ a b) (- a b))
<euiuer> (display (foo))
<euiuer> (display (+ 1 1))
<euiuer> it evails like 0 and 0.
<euiuer> but..
<euiuer> (define (foo) (+ 1 1))
<euiuer> (display (foo))
<euiuer> (define (+ a b) (- a b))
<euiuer> (display (foo))
<euiuer> (display (+ 1 1))
<euiuer> it evails like 2 2 0
<euiuer> it is kind of odd.
He confirms he gets these when he runs these from a script.
I get the same on my 1.8.8 install, both at the repl and from a script.
Since it evaluates correct if we run (bar) _after_ redefining + I think
it's a safe bet to assume that 1.8 cached the reference to +, but not
having been around for 1.8, this is a conjecture only.
Now, 1.8 is the old series, how about 2? Running a recent master
(9b977c836bf147d386944c401113aba32776fa68)[0].
From the repl:
scheme@(guile−user)> (define (foo) (+ 1 1))
scheme@(guile−user)> (define (+ a b) (- a b))
scheme@(guile−user)> (foo)
$2 = 2
scheme@(guile−user)> (+ 1 1)
$3 = 0
and
scheme@(guile−user)> (define (foo) (+ 1 1))
scheme@(guile−user)> (foo)
$2 = 2
scheme@(guile−user)> (define (+ a b) (- a b))
scheme@(guile−user)> (foo)
$3 = 2
scheme@(guile−user)> (+ 1 1)
$4 = 0
From a script
$ guile -q -s /tmp/file1.scm
22
$ guile -q -s /tmp/file2.scm
222
This behaviour can be "blamed" on guile 2's more aggressive
optimisation. Indeed,
scheme@(guile−user)> ,disassemble foo
Disassembly of #<procedure foo ()>:
0 (assert−nargs−ee/locals 0) ;; 0 args, 0 locals
2 (make−int8 2) ;; 2 at (unknown file):5:14
4 (return)
is pretty much what we want usually. And I'm inclined to say NOTABUG for
the repl when optimisation is turned on. However, in a script, this is a
bug IMO, since we shouldn't really be optimising + if our top-level
binding for + is not the builtin one, and we can certainly detect a
redefinition of + within a file.
Just to be sure, I tried turning off cse and peal, but ran into a
different optimisation
scheme@(guile−user)> ,option compile-options (#:partial-eval? #f #:cse? #f)
scheme@(guile−user)> ,option compile-options
(#:partial−eval? #f #:cse? #f)
scheme@(guile−user)> (foo)
$2 = 2
scheme@(guile−user)> (+ )
$3 = 0
scheme@(guile−user)> (define (+ a b) (- a b))
scheme@(guile−user)> (foo)
$4 = 2
scheme@(guile−user)> (+ 1 1)
$5 = 0
Have you guessed what it was?
scheme@(guile−user)> ,disassemble foo
Disassembly of #<procedure foo ()>:
0 (assert−nargs−ee/locals 0) ;; 0 args, 0 locals
2 (make−int8:1) ;; 1
3 (add1) at (unknown file):44:14
4 (return)
So, you can't win on this one :)
[0] I have not got a stable-2.0 install at the moment to compare, but I
suspect it will be similar.
--
Ian Price -- shift-reset.com
"Programming is like pinball. The reward for doing it well is
the opportunity to do it again" - from "The Wizardy Compiled"
This bug report was last modified 12 years and 139 days ago.
Previous Next
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.