Hi Antoine, I would say this is the correct behavior. S3 dispatch is solely (so far as I know?) concerned with the "actual classes" on the object. This is because S3 classes act as labels that inform dispatch what, and in what order, methods should be applied. You took the function class (ie label) off of your object, which means that in the S3 sense, that object is no longer a function and dispatching to function methods for it would be incorrect. This is independent of whether the object is still callable "as a function".
The analogous case for non-closures to what you are describing would be for S3 to check mode(x) after striking out with class(x) to find relevant methods. I don't think that would be appropriate. Also, as an aside, if you want your class to override methods that exist for function you would want to set the class to c("foo", "function"), not c("function", "foo"), as you had it in your example. Best, ~G On Wed, Apr 28, 2021 at 1:45 PM Antoine Fabri <antoine.fa...@gmail.com> wrote: > Dear R devel, > > as.list() can be used on functions, but not if they have a S3 class that > doesn't include "function". > > See below : > > ```r > add1 <- function(x) x+1 > > as.list(add1) > #> $x > #> > #> > #> [[2]] > #> x + 1 > > class(add1) <- c("function", "foo") > > as.list(add1) > #> $x > #> > #> > #> [[2]] > #> x + 1 > > class(add1) <- "foo" > > as.list(add1) > #> Error in as.vector(x, "list"): cannot coerce type 'closure' to vector of > type 'list' > > as.list.function(add1) > #> $x > #> > #> > #> [[2]] > #> x + 1 > ``` > > In failing case the argument is dispatched to as.list.default instead of > as.list.function. > > (1) Shouldn't it be dispatched to as.list.function ? > > (2) Shouldn't all generics when applied on an object of type closure fall > back to the `fun.function` method before falling back to the `fun.default` > method ? > > Best regards, > > Antoine > > [[alternative HTML version deleted]] > > ______________________________________________ > R-devel@r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel > [[alternative HTML version deleted]] ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel