Author: yamakenz
Date: Thu Jul  5 03:55:26 2007
New Revision: 4665

Modified:
   sigscheme-trunk/lib/srfi-1.scm
   sigscheme-trunk/src/module-srfi1.c
   sigscheme-trunk/src/procedure.c
   sigscheme-trunk/src/sigscheme.h
   sigscheme-trunk/src/sigschemeinternal.h

Log:
* This commit add C version of SRFI-1 map, map-in-order

* src/sigscheme.h
  - (scm_p_srfi1_map_in_order): New function decl
* src/sigschemeinternal.h
  - (scm_map_single_arg, scm_map_multiple_args): New function decl
* src/procedure.c
  - (ERRMSG_UNEVEN_MAP_ARGS): Modify message
  - (map_single_arg): Rename to scm_map_single_arg()
  - (scm_map_single_arg): Renamed from map_single_arg()
  - (map_multiple_args): Rename to scm_map_multiple_args()
  - (scm_map_multiple_args):
    * Renamed from map_multiple_args()
    * Add arg 'allow_uneven_lists' for SRFI-1 map and skip list length equality
      check if it is true
* src/module-srfi1.c
  - (scm_p_srfi1_map_in_order): New function
  - (scm_initialize_srfi1): Overwrite srfi-1:map and map by map-in-order
* lib/srfi-1.scm
  - (for-each): Refer map-in-order directly to allow C version of it


Modified: sigscheme-trunk/lib/srfi-1.scm
==============================================================================
--- sigscheme-trunk/lib/srfi-1.scm      (original)
+++ sigscheme-trunk/lib/srfi-1.scm      Thu Jul  5 03:55:26 2007
@@ -1037,10 +1037,9 @@
 
 ;; Added by yamaken 2007-06-15
 (define for-each
-  (let ((srfi-1:map map-in-order))  ;; preserve the implementation
-    (lambda args
-      (apply srfi-1:map args)
-      #f)))
+  (lambda args
+    (apply map-in-order args)
+    #f))
 
 ;;; filter, remove, partition
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Modified: sigscheme-trunk/src/module-srfi1.c
==============================================================================
--- sigscheme-trunk/src/module-srfi1.c  (original)
+++ sigscheme-trunk/src/module-srfi1.c  Thu Jul  5 03:55:26 2007
@@ -71,17 +71,14 @@
 {
     scm_require(SCMLIBDIR "/srfi-1.scm");
 
-    scm_define_alias("srfi-1:map",      "map");
     scm_define_alias("srfi-1:for-each", "for-each");
     scm_define_alias("srfi-1:member",   "member");
     scm_define_alias("srfi-1:assoc",    "assoc");
 
 #if 0
-    /* Although SigScheme's map is faster than srfi-1.scm and in-order, it is
-     * not conforming to SRFI-1 specification since it rejects unequal length
-     * arguments. If you need to use the efficient C version of map and
-     * for-each, evaluate (define map r5rs:map) and (define for-each
-     * r5rs:for-each) in your code after (use srfi-1). */
+    /* Although SigScheme's R5RS map is faster than srfi-1.scm and in-order, it
+     * is not conforming to SRFI-1 specification since it rejects unequal
+     * length arguments. */
     scm_define_alias("map-in-order", "r5rs:map");
     scm_define_alias("map",          "r5rs:map");
     scm_define_alias("for-each",     "r5rs:for-each");
@@ -90,6 +87,9 @@
     /* Overwrite Scheme procedures with efficient C implementations. */
     scm_register_funcs(scm_functable_srfi1);
 
+    scm_define_alias("srfi-1:map",   "map-in-order");
+    scm_define_alias("map",          "map-in-order");
+
     scm_define_alias("proper-list?", "list?");
     /* SigScheme's list-tail satisfies the specification of drop. */
     scm_define_alias("drop",         "list-tail");
@@ -152,6 +152,25 @@
         return MAKE_INT(SCM_LISTLEN_DOTTED(len));
     else /* if (SCM_LISTLEN_CIRCULARP(len)) */
         return SCM_FALSE;
+}
+
+/*===========================================================================
+  Fold, unfold & map
+===========================================================================*/
+SCM_EXPORT ScmObj
+scm_p_srfi1_map_in_order(ScmObj proc, ScmObj args)
+{
+    DECLARE_FUNCTION("map-in-order", procedure_variadic_1);
+
+    if (NULLP(args))
+        ERR("wrong number of arguments");
+
+    /* fast path for single arg case */
+    if (NULLP(CDR(args)))
+        return scm_map_single_arg(proc, CAR(args));
+
+    /* multiple args case */
+    return scm_map_multiple_args(proc, args, scm_true);
 }
 
 /*===========================================================================

Modified: sigscheme-trunk/src/procedure.c
==============================================================================
--- sigscheme-trunk/src/procedure.c     (original)
+++ sigscheme-trunk/src/procedure.c     Thu Jul  5 03:55:26 2007
@@ -43,7 +43,7 @@
 /*=======================================
   File Local Macro Definitions
 =======================================*/
-#define ERRMSG_UNEVEN_MAP_ARGS "uneven-length lists are passed as arguments"
+#define ERRMSG_UNEVEN_MAP_ARGS "unequal-length lists are passed as arguments"
 
 /*=======================================
   File Local Type Definitions
@@ -58,8 +58,6 @@
 /*=======================================
   File Local Function Declarations
 =======================================*/
-static ScmObj map_single_arg(ScmObj proc, ScmObj lst);
-static ScmObj map_multiple_args(ScmObj proc, ScmObj lsts);
 
 /*=======================================
   Function Definitions
@@ -283,14 +281,14 @@
 
     /* fast path for single arg case */
     if (NULLP(CDR(args)))
-        return map_single_arg(proc, CAR(args));
+        return scm_map_single_arg(proc, CAR(args));
 
     /* multiple args case */
-    return map_multiple_args(proc, args);
+    return scm_map_multiple_args(proc, args, scm_false);
 }
 
-static ScmObj
-map_single_arg(ScmObj proc, ScmObj lst)
+SCM_EXPORT ScmObj
+scm_map_single_arg(ScmObj proc, ScmObj lst)
 {
     ScmQueue q;
     ScmObj elm, ret;
@@ -307,8 +305,8 @@
     return ret;
 }
 
-static ScmObj
-map_multiple_args(ScmObj proc, ScmObj lsts)
+SCM_EXPORT ScmObj
+scm_map_multiple_args(ScmObj proc, ScmObj lsts, scm_bool allow_uneven_lists)
 {
     ScmQueue retq, argq;
     ScmObj ret, elm, map_args, rest_lsts, lst;
@@ -338,6 +336,7 @@
 
  finish:
 #if SCM_STRICT_ARGCHECK
+    if (!allow_uneven_lists) {
     /* R5RS: 6.4 Control features
      * > If more than one list is given, then they must all be the same length.
      * SigScheme rejects such user-error explicitly. */
@@ -348,6 +347,7 @@
             ERR(ERRMSG_UNEVEN_MAP_ARGS);
     }
     NO_MORE_ARG(lsts);
+    }
 #endif
 
     return ret;

Modified: sigscheme-trunk/src/sigscheme.h
==============================================================================
--- sigscheme-trunk/src/sigscheme.h     (original)
+++ sigscheme-trunk/src/sigscheme.h     Thu Jul  5 03:55:26 2007
@@ -1677,6 +1677,7 @@
 SCM_EXPORT ScmObj scm_p_srfi1_dotted_listp(ScmObj obj);
 SCM_EXPORT ScmObj scm_p_srfi1_last_pair(ScmObj lst);
 SCM_EXPORT ScmObj scm_p_srfi1_lengthplus(ScmObj lst);
+SCM_EXPORT ScmObj scm_p_srfi1_map_in_order(ScmObj proc, ScmObj args);
 SCM_EXPORT ScmObj scm_p_srfi1_find_tail(ScmObj pred, ScmObj lst);
 #endif /* SCM_USE_SRFI1 */
 

Modified: sigscheme-trunk/src/sigschemeinternal.h
==============================================================================
--- sigscheme-trunk/src/sigschemeinternal.h     (original)
+++ sigscheme-trunk/src/sigschemeinternal.h     Thu Jul  5 03:55:26 2007
@@ -735,6 +735,11 @@
 /* error.c */
 SCM_EXPORT void scm_init_error(void);
 
+/* procedure.c */
+SCM_EXPORT ScmObj scm_map_single_arg(ScmObj proc, ScmObj lst);
+SCM_EXPORT ScmObj scm_map_multiple_args(ScmObj proc, ScmObj lsts,
+                                        scm_bool allow_uneven_lists);
+
 /* list.c */
 SCM_EXPORT scm_int_t scm_finite_length(ScmObj lst);
 

Reply via email to