diff --git a/am/bootstrap.am b/am/bootstrap.am index d4a415e35..96023d83d 100644 --- a/am/bootstrap.am +++ b/am/bootstrap.am @@ -271,6 +271,7 @@ SOURCES = \ oop/goops/stklos.scm \ oop/goops/accessors.scm \ oop/goops/simple.scm \ + oop/goops/keyword-formals.scm \ \ scheme/base.scm \ scheme/case-lambda.scm \ diff --git a/doc/ref/goops.texi b/doc/ref/goops.texi index e7d1923c8..1a75af89f 100644 --- a/doc/ref/goops.texi +++ b/doc/ref/goops.texi @@ -954,11 +954,39 @@ the rest argument, as for @code{define*}. @end deffn @menu +* Advanced argument handling in method and define-method:: * Type dispatch and redefinition for advanced argument handling:: * next-method call in method*:: * Advanced argument handling design choices:: @end menu +@node Advanced argument handling in method and define-method +@subsubsection Advanced argument handling in method and define-method + +Some users may find it more natural not to have to choose between +@code{define-method} and @code{define-method*} in their code. + +It turns out that @code{method*} and @code{define-method*} can do just +fine also for ordinary methods without keyword formals. They take +marginally longer to compile but result in the same code as +@code{method} and @code{define-method} if keyword formals are absent. + +For this reason, we provide a module (oop goops keyword-formals) which +replaces the standard @code{method} and @code{define-method} bindings +with their keyword formal counterparts. It can be used like this: + +@lisp +(use-modules (oop goops) (oop goops keyword-formals)) +@end lisp + +or + +@lisp +(define-module (foo) + #:use-module (oop goops) + #:use-module (oop goops keyword-formals)) +@end lisp + @node Type dispatch and redefinition for advanced argument handling @subsubsection Type dispatch and redefinition for advanced argument handling @@ -1082,6 +1110,9 @@ to only provide the simpler functionality (through @code{method} and @code{define-method}). @end enumerate +However, note that users who prefer to only use @code{define-method} can +do so. @xref{Advanced argument handling in method and define-method}. + Second, we have chosen not to do type dispatch on optional or keyword arguments. Reasons include: diff --git a/module/oop/goops/keyword-formals.scm b/module/oop/goops/keyword-formals.scm new file mode 100644 index 000000000..92c064de4 --- /dev/null +++ b/module/oop/goops/keyword-formals.scm @@ -0,0 +1,31 @@ +;;; installed-scm-file + +;;;; Copyright (C) 2024 Free Software Foundation, Inc. +;;;; +;;;; This library is free software; you can redistribute it and/or +;;;; modify it under the terms of the GNU Lesser General Public +;;;; License as published by the Free Software Foundation; either +;;;; version 3 of the License, or (at your option) any later version. +;;;; +;;;; This library is distributed in the hope that it will be useful, +;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;;;; Lesser General Public License for more details. +;;;; +;;;; You should have received a copy of the GNU Lesser General Public +;;;; License along with this library; if not, write to the Free Software +;;;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +;;;; + + +;;; This module replaces the standard method and define-method syntax +;;; with versions with advanced argument handling. This doesn't incur +;;; overhead for methods without keyword formals except marginally for +;;; compilation. +;;; +(define-module (oop goops keyword-formals) + #:use-module ((oop goops) + #:select ((method* . method) + (define-method* . define-method))) + #:re-export-and-replace (method define-method)) +