1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-05-20 11:40:18 +02:00

fix string-filter and string-delete argument order

* libguile/srfi-13.h:
* libguile/srfi-13.c (scm_string_filter, scm_string_delete): Swap
  char_pred and s argument order, to comply with SRFI-13. There is a
  back-compat shim that will detect programs that used the old,
  erroneous interface, while giving a warning.

* doc/ref/api-data.texi: Update docs.
This commit is contained in:
Andy Wingo 2010-11-19 17:08:36 +01:00
parent 402c35ac81
commit 9fe717e23c
3 changed files with 42 additions and 13 deletions

View file

@ -3850,8 +3850,8 @@ If @var{start} or @var{end} indices are provided, they restrict
of @var{s}. of @var{s}.
@end deffn @end deffn
@deffn {Scheme Procedure} string-filter s char_pred [start [end]] @deffn {Scheme Procedure} string-filter char_pred s [start [end]]
@deffnx {C Function} scm_string_filter (s, char_pred, start, end) @deffnx {C Function} scm_string_filter (char_pred, s, start, end)
Filter the string @var{s}, retaining only those characters which Filter the string @var{s}, retaining only those characters which
satisfy @var{char_pred}. satisfy @var{char_pred}.
@ -3860,8 +3860,8 @@ a predicate, if it is a character, it is tested for equality and if it
is a character set, it is tested for membership. is a character set, it is tested for membership.
@end deffn @end deffn
@deffn {Scheme Procedure} string-delete s char_pred [start [end]] @deffn {Scheme Procedure} string-delete char_pred s [start [end]]
@deffnx {C Function} scm_string_delete (s, char_pred, start, end) @deffnx {C Function} scm_string_delete (char_pred, s, start, end)
Delete characters satisfying @var{char_pred} from @var{s}. Delete characters satisfying @var{char_pred} from @var{s}.
If @var{char_pred} is a procedure, it is applied to each character as If @var{char_pred} is a procedure, it is applied to each character as

View file

@ -29,6 +29,7 @@
#include "libguile.h" #include "libguile.h"
#include <libguile/deprecation.h>
#include "libguile/srfi-13.h" #include "libguile/srfi-13.h"
#include "libguile/srfi-14.h" #include "libguile/srfi-14.h"
@ -3033,7 +3034,7 @@ SCM_DEFINE (scm_string_split, "string-split", 2, 0, 0,
SCM_DEFINE (scm_string_filter, "string-filter", 2, 2, 0, SCM_DEFINE (scm_string_filter, "string-filter", 2, 2, 0,
(SCM s, SCM char_pred, SCM start, SCM end), (SCM char_pred, SCM s, SCM start, SCM end),
"Filter the string @var{s}, retaining only those characters\n" "Filter the string @var{s}, retaining only those characters\n"
"which satisfy @var{char_pred}.\n" "which satisfy @var{char_pred}.\n"
"\n" "\n"
@ -3047,7 +3048,21 @@ SCM_DEFINE (scm_string_filter, "string-filter", 2, 2, 0,
SCM result; SCM result;
size_t idx; size_t idx;
MY_VALIDATE_SUBSTRING_SPEC (1, s, if (scm_is_string (char_pred))
{
SCM tmp;
scm_c_issue_deprecation_warning
("Guile used to use the wrong argument order for string-filter.\n"
"This call to string-filter had the arguments in the wrong order.\n"
"See SRFI-13 for more details. At some point we will remove this hack.");
tmp = char_pred;
char_pred = s;
s = tmp;
}
MY_VALIDATE_SUBSTRING_SPEC (2, s,
3, start, cstart, 3, start, cstart,
4, end, cend); 4, end, cend);
@ -3130,7 +3145,7 @@ SCM_DEFINE (scm_string_filter, "string-filter", 2, 2, 0,
SCM ls = SCM_EOL; SCM ls = SCM_EOL;
SCM_ASSERT (scm_is_true (scm_procedure_p (char_pred)), SCM_ASSERT (scm_is_true (scm_procedure_p (char_pred)),
char_pred, SCM_ARG2, FUNC_NAME); char_pred, SCM_ARG1, FUNC_NAME);
idx = cstart; idx = cstart;
while (idx < cend) while (idx < cend)
{ {
@ -3151,7 +3166,7 @@ SCM_DEFINE (scm_string_filter, "string-filter", 2, 2, 0,
SCM_DEFINE (scm_string_delete, "string-delete", 2, 2, 0, SCM_DEFINE (scm_string_delete, "string-delete", 2, 2, 0,
(SCM s, SCM char_pred, SCM start, SCM end), (SCM char_pred, SCM s, SCM start, SCM end),
"Delete characters satisfying @var{char_pred} from @var{s}.\n" "Delete characters satisfying @var{char_pred} from @var{s}.\n"
"\n" "\n"
"If @var{char_pred} is a procedure, it is applied to each\n" "If @var{char_pred} is a procedure, it is applied to each\n"
@ -3164,7 +3179,21 @@ SCM_DEFINE (scm_string_delete, "string-delete", 2, 2, 0,
SCM result; SCM result;
size_t idx; size_t idx;
MY_VALIDATE_SUBSTRING_SPEC (1, s, if (scm_is_string (char_pred))
{
SCM tmp;
scm_c_issue_deprecation_warning
("Guile used to use the wrong argument order for string-delete.\n"
"This call to string-filter had the arguments in the wrong order.\n"
"See SRFI-13 for more details. At some point we will remove this hack.");
tmp = char_pred;
char_pred = s;
s = tmp;
}
MY_VALIDATE_SUBSTRING_SPEC (2, s,
3, start, cstart, 3, start, cstart,
4, end, cend); 4, end, cend);
@ -3265,7 +3294,7 @@ SCM_DEFINE (scm_string_delete, "string-delete", 2, 2, 0,
{ {
SCM ls = SCM_EOL; SCM ls = SCM_EOL;
SCM_ASSERT (scm_is_true (scm_procedure_p (char_pred)), SCM_ASSERT (scm_is_true (scm_procedure_p (char_pred)),
char_pred, SCM_ARG2, FUNC_NAME); char_pred, SCM_ARG1, FUNC_NAME);
idx = cstart; idx = cstart;
while (idx < cend) while (idx < cend)

View file

@ -3,7 +3,7 @@
/* srfi-13.c --- SRFI-13 procedures for Guile /* srfi-13.c --- SRFI-13 procedures for Guile
* *
* Copyright (C) 2001, 2004, 2006, 2008 Free Software Foundation, Inc. * Copyright (C) 2001, 2004, 2006, 2008, 2010 Free Software Foundation, Inc.
* *
* This library is free software; you can redistribute it and/or * This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License * modify it under the terms of the GNU Lesser General Public License
@ -111,8 +111,8 @@ SCM_API SCM scm_string_xcopy_x (SCM target, SCM tstart, SCM s, SCM sfrom, SCM st
SCM_API SCM scm_string_replace (SCM s1, SCM s2, SCM start1, SCM end1, SCM start2, SCM end2); SCM_API SCM scm_string_replace (SCM s1, SCM s2, SCM start1, SCM end1, SCM start2, SCM end2);
SCM_API SCM scm_string_tokenize (SCM s, SCM token_char, SCM start, SCM end); SCM_API SCM scm_string_tokenize (SCM s, SCM token_char, SCM start, SCM end);
SCM_API SCM scm_string_split (SCM s, SCM chr); SCM_API SCM scm_string_split (SCM s, SCM chr);
SCM_API SCM scm_string_filter (SCM s, SCM char_pred, SCM start, SCM end); SCM_API SCM scm_string_filter (SCM char_pred, SCM s, SCM start, SCM end);
SCM_API SCM scm_string_delete (SCM s, SCM char_pred, SCM start, SCM end); SCM_API SCM scm_string_delete (SCM char_pred, SCM s, SCM start, SCM end);
SCM_INTERNAL void scm_init_srfi_13 (void); SCM_INTERNAL void scm_init_srfi_13 (void);
SCM_INTERNAL void scm_init_srfi_13_14 (void); SCM_INTERNAL void scm_init_srfi_13_14 (void);