GNU bug report logs -
#26106
Defining a method named '-' with one parameter
Previous Next
To reply to this bug, email your comments to 26106 AT debbugs.gnu.org.
Toggle the display of automated, internal messages from the tracker.
Report forwarded
to
bug-guile <at> gnu.org
:
bug#26106
; Package
guile
.
(Wed, 15 Mar 2017 13:36:02 GMT)
Full text and
rfc822 format available.
Acknowledgement sent
to
Alejandro Sanchez <hiphish <at> openmailbox.org>
:
New bug report received and forwarded. Copy sent to
bug-guile <at> gnu.org
.
(Wed, 15 Mar 2017 13:36:02 GMT)
Full text and
rfc822 format available.
Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):
If I define a method named ‘-‘ which only takes in one parameter, the expression ‘(- v)’ gets rewritten to ‘(- 0 v)’. Here is a minimal example:
(use-modules (oop goops))
(define-class <vector2> ()
(x #:init-value 0 #:getter get-x #:init-keyword #:x)
(y #:init-value 0 #:getter get-y #:init-keyword #:y))
(define-method (* (n <number>) (v <vector2>))
(make <vector2> #:x (* n (get-x v)) #:y (* n (get-y v))))
(define-method (- (v <vector2>))
(* -1 v))
(define v (make <vector2> #:x 1 #:y 2))
(* -1 v) ; Works fine
(- v) ; Throws error
Here is the error message:
scheme@(guile-user)> (- v)
ERROR: In procedure scm-error:
ERROR: No applicable method for #<<generic> - (2)> in call (- 0 #<<vector2> 10a8e4020>)
Entering a new prompt. Type `,bt' for a backtrace or `,q' to continue.
scheme@(guile-user) [1]> ,bt
In current input:
23:0 2 (_)
In oop/goops.scm:
1438:4 1 (cache-miss 0 #<<vector2> 10a8e4020>)
In unknown file:
0 (scm-error goops-error #f "No applicable method for ~S in call ~S" (#<<generic> - (2)> (- 0 #<<vec…>)) #)
Information forwarded
to
bug-guile <at> gnu.org
:
bug#26106
; Package
guile
.
(Wed, 19 Apr 2017 15:01:02 GMT)
Full text and
rfc822 format available.
Message #8 received at 26106 <at> debbugs.gnu.org (full text, mbox):
On Wed 15 Mar 2017 14:35, Alejandro Sanchez <hiphish <at> openmailbox.org> writes:
> If I define a method named ‘-‘ which only takes in one parameter, the expression ‘(- v)’ gets rewritten to ‘(- 0 v)’. Here is a minimal example:
>
> (use-modules (oop goops))
>
> (define-class <vector2> ()
> (x #:init-value 0 #:getter get-x #:init-keyword #:x)
> (y #:init-value 0 #:getter get-y #:init-keyword #:y))
>
> (define-method (* (n <number>) (v <vector2>))
> (make <vector2> #:x (* n (get-x v)) #:y (* n (get-y v))))
>
> (define-method (- (v <vector2>))
> (* -1 v))
>
> (define v (make <vector2> #:x 1 #:y 2))
> (* -1 v) ; Works fine
> (- v) ; Throws error
>
> Here is the error message:
>
> scheme@(guile-user)> (- v)
> ERROR: In procedure scm-error:
> ERROR: No applicable method for #<<generic> - (2)> in call (- 0 #<<vector2> 10a8e4020>)
>
> Entering a new prompt. Type `,bt' for a backtrace or `,q' to continue.
> scheme@(guile-user) [1]> ,bt
> In current input:
> 23:0 2 (_)
> In oop/goops.scm:
> 1438:4 1 (cache-miss 0 #<<vector2> 10a8e4020>)
> In unknown file:
> 0 (scm-error goops-error #f "No applicable method for ~S in call ~S" (#<<generic> - (2)> (- 0 #<<vec…>)) #)
Is (- x) equivalent to (* x -1) ?
Right now there are a few things happening. The "primitive expansion"
phase in an early part of the compiler turns (- x) to (- 0 x), where
obviously it should not be doing that. But can it turn it into (* x -1)
? Note that somewhat confusingly, a later part of the compiler that can
detect when X is a real number will undo that transformation, turning it
to (- 0 x) when X is real. So that sounds OK from an optimization point
of view but is the (* x -1) tranformation correct from the math point of
view?
Andy
This bug report was last modified 8 years and 56 days ago.
Previous Next
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.