On Tue, 2005-08-02 at 10:00 +1000, Kevin Ryde wrote:
> I think you should decide now if applications need to use that module
> or not.  If not then may as well describe the full syntax with the
> main `cond' docs.

I went with the "not" route.  As I previously wrote, code that breaks on
this would be very odd indeed.

> > +;;; srfi-6.scm --- Basic String Ports
> 
> Too much cut and paste :-)

I got lazy :)

Attached is a version with the suggested doc move and no more
srfi-61.scm.  Thanks for your recommendations.

Here's a new ChangeLog set, for ice-9/, doc/ref/, and libguile/
respectively:

2005-08-01  Stephen Compall  <[EMAIL PROTECTED]>

        * boot-9.scm (%cond-expand-features): Add srfi-61.

2005-08-01  Stephen Compall  <[EMAIL PROTECTED]>

        * api-control.texi (if cond case): Describe SRFI 61 cond.

        * srfi-modules.texi (SRFI-61): New section.
        (SRFI Support): Add SRFI-61 to menu.

2005-08-01  Stephen Compall  <[EMAIL PROTECTED]>

        * eval.c (scm_m_cond): Recognize SRFI 61 cond syntax.
        (CEVAL): Evaluate SRFI 61 cond clauses.

-- 
Stephen Compall
Index: doc/ref/api-control.texi
===================================================================
RCS file: /cvsroot/guile/guile/guile-core/doc/ref/api-control.texi,v
retrieving revision 1.5
diff -d -u -r1.5 api-control.texi
--- doc/ref/api-control.texi	23 Jun 2005 00:10:53 -0000	1.5
+++ doc/ref/api-control.texi	2 Aug 2005 03:12:38 -0000
@@ -108,6 +108,26 @@
 the value of @var{test}.  The result of this procedure application is
 then the result of the @code{cond}-expression.
 
[EMAIL PROTECTED] SRFI-61
[EMAIL PROTECTED] general cond clause
[EMAIL PROTECTED] multiple values and cond
+One additional @code{cond}-clause is available as an extension to
+standard Scheme:
+
[EMAIL PROTECTED]
+(@var{test} @var{guard} => @var{expression})
[EMAIL PROTECTED] lisp
+
+where @var{guard} and @var{expression} must evaluate to procedures.
+For this clause type, @var{test} may return multiple values, and
[EMAIL PROTECTED] ignores its boolean state; instead, @code{cond} evaluates
[EMAIL PROTECTED] and applies the resulting procedure to the value(s) of
[EMAIL PROTECTED], as if @var{guard} were the @var{consumer} argument of
[EMAIL PROTECTED]  Iff the result of that procedure call is a
+true value, it evaluates @var{expression} and applies the resulting
+procedure to the value(s) of @var{test}, in the same manner as the
[EMAIL PROTECTED] was called.
+
 The @var{test} of the last @var{clause} may be the symbol @code{else}.
 Then, if none of the preceding @var{test}s is true, the
 @var{expression}s following the @code{else} are evaluated to produce the
Index: doc/ref/srfi-modules.texi
===================================================================
RCS file: /cvsroot/guile/guile/guile-core/doc/ref/srfi-modules.texi,v
retrieving revision 1.67
diff -d -u -r1.67 srfi-modules.texi
--- doc/ref/srfi-modules.texi	3 May 2005 22:50:21 -0000	1.67
+++ doc/ref/srfi-modules.texi	2 Aug 2005 03:12:44 -0000
@@ -40,6 +40,7 @@
 * SRFI-39::                     Parameter objects
 * SRFI-55::                     Requiring Features.
 * SRFI-60::                     Integers as bits.
+* SRFI-61::                     A more general `cond' clause
 @end menu
 
 
@@ -2683,6 +2684,16 @@
 (list->integer '(#t #f #t #f)) @result{} 10
 @end example
 @end defun
+
+
[EMAIL PROTECTED] SRFI-61
[EMAIL PROTECTED] SRFI-61 - A more general @code{cond} clause
+
+This SRFI extends RnRS @code{cond} to support test expressions that
+return multiple values, as well as arbitrary definitions of test
+success.  SRFI 61 is implemented in the Guile core; there's no module
+needed to get SRFI-61 itself.  Extended @code{cond} is documented in
[EMAIL PROTECTED] cond case,, Simple Conditional Evaluation}.
 
 
 @c srfi-modules.texi ends here
Index: ice-9/boot-9.scm
===================================================================
RCS file: /cvsroot/guile/guile/guile-core/ice-9/boot-9.scm,v
retrieving revision 1.351
diff -d -u -r1.351 boot-9.scm
--- ice-9/boot-9.scm	31 Jul 2005 23:36:50 -0000	1.351
+++ ice-9/boot-9.scm	2 Aug 2005 03:12:44 -0000
@@ -3223,7 +3223,7 @@
 ;;;
 ;;; Currently, the following feature identifiers are supported:
 ;;;
-;;;   guile r5rs srfi-0 srfi-4 srfi-6 srfi-13 srfi-14
+;;;   guile r5rs srfi-0 srfi-4 srfi-6 srfi-13 srfi-14 srfi-55 srfi-61
 ;;;
 ;;; Remember to update the features list when adding more SRFIs.
 ;;;
@@ -3238,6 +3238,7 @@
     srfi-13  ;; string library
     srfi-14  ;; character sets
     srfi-55  ;; require-extension
+    srfi-61  ;; general cond clause
     ))
 
 ;; This table maps module public interfaces to the list of features.
Index: libguile/eval.c
===================================================================
RCS file: /cvsroot/guile/guile/guile-core/libguile/eval.c,v
retrieving revision 1.398
diff -d -u -r1.398 eval.c
--- libguile/eval.c	12 Jul 2005 00:28:09 -0000	1.398
+++ libguile/eval.c	2 Aug 2005 03:12:44 -0000
@@ -1095,6 +1095,15 @@
           ASSERT_SYNTAX_2 (length == 3, s_extra_expression, clause, expr);
           SCM_SETCAR (SCM_CDR (clause), SCM_IM_ARROW);
 	}
+      /* SRFI 61 extended cond */
+      else if (length >= 3
+	       && scm_is_eq (SCM_CADDR (clause), scm_sym_arrow)
+	       && arrow_literal_p)
+	{
+	  ASSERT_SYNTAX_2 (length > 3, s_missing_recipient, clause, expr);
+	  ASSERT_SYNTAX_2 (length == 4, s_extra_expression, clause, expr);
+	  SCM_SETCAR (SCM_CDDR (clause), SCM_IM_ARROW);
+	}
     }
 
   SCM_SETCAR (expr, SCM_IM_COND);
@@ -3427,7 +3436,29 @@
               else
                 {
                   arg1 = EVALCAR (clause, env);
-                  if (scm_is_true (arg1) && !SCM_NILP (arg1))
+		  /* SRFI 61 extended cond */
+		  if (!scm_is_null (SCM_CDR (clause))
+		      && !scm_is_null (SCM_CDDR (clause))
+		      && scm_is_eq (SCM_CADDR (clause), SCM_IM_ARROW))
+		    {
+		      SCM xx, guard_result;
+		      if (SCM_VALUESP (arg1))
+			arg1 = scm_struct_ref (arg1, SCM_INUM0);
+		      else
+			arg1 = scm_list_1 (arg1);
+		      xx = SCM_CDR (clause);
+		      proc = EVALCAR (xx, env);
+		      guard_result = SCM_APPLY (proc, arg1, SCM_EOL);
+		      if (scm_is_true (guard_result)
+			  && !SCM_NILP (guard_result))
+			{
+			  proc = SCM_CDDR (xx);
+			  proc = EVALCAR (proc, env);
+			  PREP_APPLY (proc, arg1);
+			  goto apply_proc;
+			}
+		    }
+                  else if (scm_is_true (arg1) && !SCM_NILP (arg1))
                     {
                       x = SCM_CDR (clause);
                       if (scm_is_null (x))

Attachment: signature.asc
Description: This is a digitally signed message part

_______________________________________________
Guile-devel mailing list
Guile-devel@gnu.org
http://lists.gnu.org/mailman/listinfo/guile-devel

Reply via email to