diff --git a/ice-9/boot-9.scm b/ice-9/boot-9.scm index defab8bfb..7756b4ccd 100644 --- a/ice-9/boot-9.scm +++ b/ice-9/boot-9.scm @@ -51,6 +51,34 @@ (define format simple-format) +;; this is scheme wrapping the C code so the final pred call is a tail call, +;; per SRFI-13 spec +(define (string-any char_pred s . rest) + (let ((start (if (null? rest) + 0 (car rest))) + (end (if (or (null? rest) (null? (cdr rest))) + (string-length s) (cadr rest)))) + (if (and (procedure? char_pred) + (> end start) + (<= end (string-length s))) ;; let c-code handle range error + (or (string-any-c-code char_pred s start (1- end)) + (char_pred (string-ref s (1- end)))) + (string-any-c-code char_pred s start end)))) + +;; this is scheme wrapping the C code so the final pred call is a tail call, +;; per SRFI-13 spec +(define (string-every char_pred s . rest) + (let ((start (if (null? rest) + 0 (car rest))) + (end (if (or (null? rest) (null? (cdr rest))) + (string-length s) (cadr rest)))) + (if (and (procedure? char_pred) + (> end start) + (<= end (string-length s))) ;; let c-code handle range error + (and (string-every-c-code char_pred s start (1- end)) + (char_pred (string-ref s (1- end)))) + (string-every-c-code char_pred s start end)))) + ;;; {EVAL-CASE} diff --git a/libguile/srfi-13.c b/libguile/srfi-13.c index 169bbc94b..c00279092 100644 --- a/libguile/srfi-13.c +++ b/libguile/srfi-13.c @@ -75,7 +75,7 @@ race_error () } #endif -SCM_DEFINE (scm_string_any, "string-any", 2, 2, 0, +SCM_DEFINE (scm_string_any, "string-any-c-code", 2, 2, 0, (SCM char_pred, SCM s, SCM start, SCM end), "Check if the predicate @var{pred} is true for any character in\n" "the string @var{s}.\n" @@ -134,7 +134,7 @@ SCM_DEFINE (scm_string_any, "string-any", 2, 2, 0, #undef FUNC_NAME -SCM_DEFINE (scm_string_every, "string-every", 2, 2, 0, +SCM_DEFINE (scm_string_every, "string-every-c-code", 2, 2, 0, (SCM char_pred, SCM s, SCM start, SCM end), "Check if the predicate @var{pred} is true for every character\n" "in the string @var{s}.\n"