Opened 5 months ago

Last modified 5 months ago

#485 new defect

Differing &keyword generic method signatures cannot be eval'd

Reported by: Mark Evenson Owned by:
Priority: major Milestone: 1.8.1
Component: interpreter Version: 1.8.1-dev
Keywords: Cc:
Parent Tickets:

Description

<https://irclog.tymoon.eu/freenode/%23abcl?from=1611187078>

0:12:54
emaczen Is there a setting I can change in ABCL to not care if a method definition does not have all the keyword arguments as another method?
0:13:14
emaczen does not accept all of the keyword arguments defined for the generic function -- This is the ABCL error I am getting
0:13:42
emaczen SBCL and CCL do not care
0:30:42
charles` Is that only for keyword arguments, because SBCL definitely cares if I have different # of parameters for same method name
1:19:18
robertm Maybe you could use &allow-other-keys ?  (Just a guess.)
1:53:50
etimmons emaczen: Based on your description and some quick tests I'm guessing you're implicitly defining the generic function with defmethod. Try using an explicit defgeneric.
1:57:24
etimmons It does appear there's a bug in how defmethod defines the lambda list of the implicit defgeneric https://plaster.tymoon.eu/view/2247#2247
2:00:37
etimmons If (fboundp function-name) is nil, a generic function is created [...] the lambda list of the generic function will mention ..... key (but no keyword arguments)

Eval'ing non-congruent forms fails with a simple-error but compiling seems to work.

Change History (3)

comment:1 Changed 5 months ago by Mark Evenson

jackdaniel schooled easye on #abcl:

l easye: the congruency between the gf and the method is defined (among other rules), that method must have all key arguments from the generic function
18:04:06
jackdaniel it may have more though
18:04:45
jackdaniel when you implicitly define the generic function via defmethod, and defmethod has &key arguments, the generic function is defined as (defgeneric foo (a &key)) [i.e for (defmethod foo ((a integer) &key z d))
18:05:02
jackdaniel so they are in fact congruent
18:09:45
easye Alright.  That's right:  one doesn't typically use keyword arguments with generic functions for this reason.

comment:2 Changed 5 months ago by Mark Evenson

Summary: Non-congruent generic method signatures cannot be eval'dDiffering &keyword generic method signatures cannot be eval'd

comment:3 Changed 5 months ago by Mark Evenson

The following forms will compile as a file unit, but fail when evaluated in a REPL.

(in-package :cl-user)

(defmethod test ((a integer) &key b c)
  (declare (ignore a b c)))

(defmethod test ((a real) &key b)
  (declare (ignore (a b))))
Note: See TracTickets for help on using tickets.