~ chicken-core (chicken-5) 7152bdbe5e26d20a98941078b12dce5db8f27892
commit 7152bdbe5e26d20a98941078b12dce5db8f27892
Author: felix <felix@call-with-current-continuation.org>
AuthorDate: Sun Jan 25 22:03:05 2015 +0100
Commit: felix <felix@call-with-current-continuation.org>
CommitDate: Sun Jan 25 22:03:05 2015 +0100
mini-srfi-1.scm: length+
diff --git a/mini-srfi-1.scm b/mini-srfi-1.scm
index da82d6cd..16ffc33a 100644
--- a/mini-srfi-1.scm
+++ b/mini-srfi-1.scm
@@ -29,7 +29,7 @@
(hide take span drop partition split-at append-map every any cons* concatenate delete
first second third fourth alist-cons delete-duplicates fifth
filter filter-map unzip1 last list-index lset-adjoin lset-difference
- lset-union lset-intersection list-tabulate lset<= lset=))
+ lset-union lset-intersection list-tabulate lset<= lset= length+))
(define (partition pred lst)
@@ -184,3 +184,18 @@
(define (lset= s1 s2)
(and (eq? (length s1) (length s2))
(every (lambda (s) (memq s s2)) s1)))
+
+;; from SRFI-1 ref. impl.
+(define (length+ x) ; Returns #f if X is circular.
+ (let lp ((x x) (lag x) (len 0))
+ (if (pair? x)
+ (let ((x (cdr x))
+ (len (fx+ len 1)))
+ (if (pair? x)
+ (let ((x (cdr x))
+ (lag (cdr lag))
+ (len (fx+ len 1)))
+ (and (not (eq? x lag)) (lp x lag len)))
+ len))
+ len)))
+
Trap