Author: kzk
Date: Fri Aug 12 01:21:58 2005
New Revision: 1188

Modified:
   branches/r5rs/sigscheme/eval.c
   branches/r5rs/sigscheme/operations.c

Log:
* sigscheme/eval.c
  - (extend_environment): accept NULL vars and vals
* sigscheme/operations.c
  - (ScmOp_c_length): new func ported from Gauche
  - (ScmOp_length, ScmOp_listp): support circular list check


Modified: branches/r5rs/sigscheme/eval.c
==============================================================================
--- branches/r5rs/sigscheme/eval.c      (original)
+++ branches/r5rs/sigscheme/eval.c      Fri Aug 12 01:21:58 2005
@@ -89,10 +89,6 @@
 {
     ScmObj frame = SCM_NIL;
 
-    /* sanity check */
-    if (SCM_NULLP(vars) && SCM_NULLP(vals))
-       return env;
-
     /* create new frame */
     frame   = Scm_NewCons(vars, vals);
 

Modified: branches/r5rs/sigscheme/operations.c
==============================================================================
--- branches/r5rs/sigscheme/operations.c        (original)
+++ branches/r5rs/sigscheme/operations.c        Fri Aug 12 01:21:58 2005
@@ -59,6 +59,7 @@
   File Local Function Declarations
 =======================================*/
 static ScmObj list_gettail(ScmObj head);
+static int ScmOp_c_length(ScmObj list);
 static ScmObj ScmOp_listtail_internal(ScmObj obj, int k);
 static ScmObj ScmOp_append_internal(ScmObj head, ScmObj tail);
 
@@ -925,11 +926,16 @@
 
 ScmObj ScmOp_listp(ScmObj obj)
 {
-    for (; !SCM_NULLP(obj); obj = SCM_CDR(obj)) {
-        /* check if valid list */
-        if (!SCM_CONSP(obj))
-            return SCM_FALSE;
-    }
+    int len = 0;
+
+    if (SCM_NULLP(obj))
+       return SCM_TRUE;
+    if (!SCM_CONSP(obj))
+       return SCM_FALSE;
+
+    len = ScmOp_c_length(obj);
+    if (len == -1)
+       return SCM_FALSE;
 
     return SCM_TRUE;
 }
@@ -950,18 +956,40 @@
     return SCM_NIL;
 }
 
-ScmObj ScmOp_length(ScmObj obj)
-{
-    int length = 0;
-    for (; !SCM_NULLP(obj); obj = SCM_CDR(obj)) {
-        /* check if valid list */
-        if (!SCM_NULLP(obj) && !SCM_CONSP(obj))
-            SigScm_ErrorObj("length : bad list. given obj contains ", obj);
-
-        length++;
+/*
+ * Notice
+ *
+ * This function is ported from Gauche, by Shiro Kawai([EMAIL PROTECTED])
+ */
+int ScmOp_c_length(ScmObj obj)
+{
+    ScmObj slow = obj;
+    int len = 0;
+
+    if (SCM_NULLP(obj)) return 0;
+
+    for (;;) {
+        if (SCM_NULLP(obj)) break;
+        if (!SCM_CONSP(obj)) return -1;
+       if (len != 0 && obj == slow) return -1; /* circular */
+       
+       obj = SCM_CDR(obj);
+       len++;
+        if (SCM_NULLP(obj)) break;
+        if (!SCM_CONSP(obj)) return -1;
+       if (obj == slow) return -1; /* circular */
+
+       obj = SCM_CDR(obj);
+       slow = SCM_CDR(slow);
+       len++;
     }
 
-    return Scm_NewInt(length);
+    return len;
+}
+
+ScmObj ScmOp_length(ScmObj obj)
+{
+    return Scm_NewInt(ScmOp_c_length(obj));
 }
 
 ScmObj ScmOp_append_internal(ScmObj head, ScmObj tail)

Reply via email to