guile-commits
[Top][All Lists]
Advanced

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

[Guile-commits] branch main updated: New module (oop goops keyword-forma


From: Mikael Djurfeldt
Subject: [Guile-commits] branch main updated: New module (oop goops keyword-formals)
Date: Tue, 26 Nov 2024 13:38:08 -0500

This is an automated email from the git hooks/post-receive script.

mdj pushed a commit to branch main
in repository guile.

The following commit(s) were added to refs/heads/main by this push:
     new fe05646f7 New module (oop goops keyword-formals)
fe05646f7 is described below

commit fe05646f7c5881b6b53060d552026d41dd30ff35
Author: Mikael Djurfeldt <mikael@djurfeldt.com>
AuthorDate: Tue Nov 26 19:02:07 2024 +0100

    New module (oop goops keyword-formals)
    
    This module replaces the method and define-method bindings with their
    method* and define-method* counterparts, for use by users who prefer not
    to use both kinds of syntactic forms.
    
    * module/oop/goops/keyword-formals.scm: New module.
    * am/bootstrap.am: Added
    * doc/ref/goops.texi: Document this change.
---
 am/bootstrap.am                      |  1 +
 doc/ref/goops.texi                   | 31 +++++++++++++++++++++++++++++++
 module/oop/goops/keyword-formals.scm | 31 +++++++++++++++++++++++++++++++
 3 files changed, 63 insertions(+)

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



reply via email to

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