GNU bug report logs - #26106
Defining a method named '-' with one parameter

Previous Next

Package: guile;

Reported by: Alejandro Sanchez <hiphish <at> openmailbox.org>

Date: Wed, 15 Mar 2017 13:36:01 UTC

Severity: normal

To reply to this bug, email your comments to 26106 AT debbugs.gnu.org.

Toggle the display of automated, internal messages from the tracker.

View this report as an mbox folder, status mbox, maintainer mbox


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):

From: Alejandro Sanchez <hiphish <at> openmailbox.org>
To: bug-guile <at> gnu.org
Subject: Defining a method named '-' with one parameter
Date: Wed, 15 Mar 2017 14:35:18 +0100
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):

From: Andy Wingo <wingo <at> igalia.com>
To: Alejandro Sanchez <hiphish <at> openmailbox.org>
Cc: 26106 <at> debbugs.gnu.org
Subject: Re: bug#26106: Defining a method named '-' with one parameter
Date: Wed, 19 Apr 2017 17:00:25 +0200
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.