diff options
author | Ludovic Courtès <ludo@gnu.org> | 2010-08-27 15:43:30 +0200 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2010-08-27 18:59:42 +0200 |
commit | b86d23093284512a6a3c1780e9e5547c9ab34c25 (patch) | |
tree | cb6c52c23b3edf548b41658728ea4d926ca0227c /module/srfi/srfi-1.scm | |
parent | d7418e60a5b427a9d733929cf6ff468402dada1d (diff) | |
download | guile-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.scm | 24 |
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) |