bug-guile
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

bug#26026: closed (Re: bug#26026: Defining a method named zero? breaks p


From: Alejandro Sanchez
Subject: bug#26026: closed (Re: bug#26026: Defining a method named zero? breaks primitive zero?)
Date: Sat, 22 Apr 2017 16:46:40 +0200

This does not work. If I remove the export of ‘zero?’ I get another error:

scheme@(guile-user)>  (zero? (make <vector2>))
<unnamed port>:3:1: <unnamed port>:3:1: In procedure =: Wrong type: #<<vector2> 106606e20>
Entering a new prompt.  Type `,bt' for a backtrace or `,q' to continue.
scheme@(guile-user) [1]> ,bt
In current input:
      3:1  0 (_)
scheme@(guile-user) [1]>

That is why I was exporting ‘zero?’ to begin with. I do not have to export ‘+’ or ‘-‘ for example.

On 19 Apr 2017, at 17:13, GNU bug Tracking System <address@hidden> wrote:

Your bug report

#26026: Defining a method named zero? breaks primitive zero?

which was filed against the guile package, has been closed.

The explanation is attached below, along with your original report.
If you require more details, please reply to address@hidden.

--
26026: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=26026
GNU Bug Tracking System
Contact address@hidden with problems

From: Andy Wingo <address@hidden>
Subject: Re: bug#26026: Defining a method named zero? breaks primitive zero?
Date: 19 April 2017 at 17:12:12 GMT+2
To: Alejandro Sanchez <address@hidden>


On Wed 08 Mar 2017 12:07, Alejandro Sanchez <address@hidden> writes:

If I define a ‘zero?’ predicate method for a custom class the primitive ‘zero?’ is lost. Here is a simple vector module:

;;; File vector2.scm
(define-module (vector2)
 #:use-module (oop goops)
 #:export (<vector2> get-x get-y zero?))

(define-class <vector2> ()
 (x #:init-value 0 #:getter get-x #:init-keyword #:x)
 (y #:init-value 0 #:getter get-y #:init-keyword #:y) )

(define-generic zero?)
(define-method (zero? (v <vector2>))
 (and (zero? (get-x v))
      (zero? (get-y v))))

In the Guile REPL try executing the following code:

scheme@(guile-user)> (use-modules (oop goops) (vector2))
scheme@(guile-user)> (zero? (make <vector2>))

This will display

WARNING: (guile-user): `zero?' imported from both (ice-9 r5rs) and (vector2)
ERROR: In procedure scm-error:
ERROR: No applicable method for #<<generic> zero? (1)> in call (zero? 0)

Entering a new prompt.  Type `,bt' for a backtrace or `,q' to continue.
scheme@(guile-user) [1]> ,bt
In vector2.scm:
    11:7  2 (_ #<<vector2> 105e87e00>)
In oop/goops.scm:
  1438:4  1 (cache-miss 0)
In unknown file:
          0 (scm-error goops-error #f "No applicable method for ~S in call ~S" (#<<gen…> …) …)

Apparently the problem is that ‘zero?’ is defined in two modules and
the vector2 definition overrides it. This isn’t the case with other
primitives like ‘+’ or ‘*’, so this seems like a bug? I had built
Guile from HEAD a few days ago, my package manager shows 6fff84d as
the version number, so I guess that must be the hash of the commit
HEAD was pointing to at that time.

Actually the (vector2) module makes a fresh definition for zero?.  You
can tell because zero? is in its export list.  So instead of extending
the primitive-generic that is zero?, you are making a new definition.
See:

 scheme@(guile-user)> (define-module (foo) #:export (zero?))
 $1 = #<directory (foo) 1203c80>
 scheme@(foo)> (zero? 0)
 <unnamed port>:4:0: <unnamed port>:4:0: Unbound variable: zero?

 Entering a new prompt.  Type `,bt' for a backtrace or `,q' to continue.

If you want to extend a primitive-generic, then do that by not exporting
zero?.  In a way it's like mutating the primitive in place, giving it
additional powers.

Andy




From: Alejandro Sanchez <address@hidden>
Subject: Defining a method named zero? breaks primitive zero?
Date: 8 March 2017 at 12:07:56 GMT+1


If I define a ‘zero?’ predicate method for a custom class the primitive ‘zero?’ is lost. Here is a simple vector module:

;;; File vector2.scm
(define-module (vector2)
 #:use-module (oop goops)
 #:export (<vector2> get-x get-y zero?))

(define-class <vector2> ()
 (x #:init-value 0 #:getter get-x #:init-keyword #:x)
 (y #:init-value 0 #:getter get-y #:init-keyword #:y) )

(define-generic zero?)
(define-method (zero? (v <vector2>))
 (and (zero? (get-x v))
      (zero? (get-y v))))

In the Guile REPL try executing the following code:

scheme@(guile-user)> (use-modules (oop goops) (vector2))
scheme@(guile-user)> (zero? (make <vector2>))

This will display

WARNING: (guile-user): `zero?' imported from both (ice-9 r5rs) and (vector2)
ERROR: In procedure scm-error:
ERROR: No applicable method for #<<generic> zero? (1)> in call (zero? 0)

Entering a new prompt.  Type `,bt' for a backtrace or `,q' to continue.
scheme@(guile-user) [1]> ,bt
In vector2.scm:
    11:7  2 (_ #<<vector2> 105e87e00>)
In oop/goops.scm:
  1438:4  1 (cache-miss 0)
In unknown file:
          0 (scm-error goops-error #f "No applicable method for ~S in call ~S" (#<<gen…> …) …)

Apparently the problem is that ‘zero?’ is defined in two modules and the vector2 definition overrides it. This isn’t the case with other primitives like ‘+’ or ‘*’, so this seems like a bug? I had built Guile from HEAD a few days ago, my package manager shows 6fff84d as the version number, so I guess that must be the hash of the commit HEAD was pointing to at that time.





reply via email to

[Prev in Thread] Current Thread [Next in Thread]