summaryrefslogtreecommitdiff
path: root/module/srfi/srfi-1.scm
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2010-08-27 15:43:30 +0200
committerLudovic Courtès <ludo@gnu.org>2010-08-27 18:59:42 +0200
commitb86d23093284512a6a3c1780e9e5547c9ab34c25 (patch)
treecb6c52c23b3edf548b41658728ea4d926ca0227c /module/srfi/srfi-1.scm
parentd7418e60a5b427a9d733929cf6ff468402dada1d (diff)
downloadguile-b86d23093284512a6a3c1780e9e5547c9ab34c25.tar.gz
SRFI-1: Rewrite `break' and `break!' in Scheme.
This partially reverts commit 6e9f3c2676c0101590d4229653e9c628cb293064 (Tue May 3 2005). * module/srfi/srfi-1.scm (break, break!): New procedures. * srfi/srfi-1.c (scm_srfi1_break, scm_srfi1_break_x): Rewrite as proxies to the corresponding Scheme procedures. * test-suite/standalone/test-srfi-1.c (failure): New function. (tests): Add `scm_srfi1_break' test. Use `failure'.
Diffstat (limited to 'module/srfi/srfi-1.scm')
-rw-r--r--module/srfi/srfi-1.scm24
1 files changed, 24 insertions, 0 deletions
diff --git a/module/srfi/srfi-1.scm b/module/srfi/srfi-1.scm
index 54008146e..852729346 100644
--- a/module/srfi/srfi-1.scm
+++ b/module/srfi/srfi-1.scm
@@ -472,6 +472,30 @@ that result. See the manual for details."
;;; Searching
+(define (break pred clist)
+ "Return two values, the longest initial prefix of LST whose elements
+all fail the predicate PRED, and the remainder of LST."
+ (let lp ((clist clist) (rl '()))
+ (if (or (null? clist)
+ (pred (car clist)))
+ (values (reverse! rl) clist)
+ (lp (cdr clist) (cons (car clist) rl)))))
+
+(define (break! pred list)
+ "Linear-update variant of `break'."
+ (let loop ((l list)
+ (prev #f))
+ (cond ((null? l)
+ (values list '()))
+ ((pred (car l))
+ (if (pair? prev)
+ (begin
+ (set-cdr! prev '())
+ (values list l))
+ (values '() list)))
+ (else
+ (loop (cdr l) l)))))
+
(define (any pred ls . lists)
(if (null? lists)
(any1 pred ls)