diff options
author | Kevin Ryde <user42@zip.com.au> | 2005-03-15 21:49:25 +0000 |
---|---|---|
committer | Kevin Ryde <user42@zip.com.au> | 2005-03-15 21:49:25 +0000 |
commit | d2f57ee0142d21b5bff3d5006bb57bcdfd1709c1 (patch) | |
tree | 2ca2bf8387b1b8c5c4baf60fd631a23571a3a37e /srfi/srfi-1.c | |
parent | 74b2357378324ad081618761079111d7bff88665 (diff) | |
download | guile-d2f57ee0142d21b5bff3d5006bb57bcdfd1709c1.tar.gz |
(split-at, split-at!): Rewrite in C.
Diffstat (limited to 'srfi/srfi-1.c')
-rw-r--r-- | srfi/srfi-1.c | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/srfi/srfi-1.c b/srfi/srfi-1.c index e93472967..8bf077b43 100644 --- a/srfi/srfi-1.c +++ b/srfi/srfi-1.c @@ -1007,6 +1007,57 @@ SCM_DEFINE (scm_srfi1_remove_x, "remove!", 2, 0, 0, #undef FUNC_NAME +SCM_DEFINE (scm_srfi1_split_at, "split-at", 2, 0, 0, + (SCM lst, SCM n), + "Return two values (multiple values), being a list of the\n" + "elements before index @var{n} in @var{lst}, and a list of those\n" + "after.") +#define FUNC_NAME s_scm_srfi1_split_at +{ + size_t nn; + /* pre is a list of elements before the i split point, loc is the CDRLOC + of the last cell, ie. where to store to append to it */ + SCM pre = SCM_EOL; + SCM *loc = ⪯ + + for (nn = scm_to_size_t (n); nn != 0; nn--) + { + SCM_VALIDATE_CONS (SCM_ARG1, lst); + + *loc = scm_cons (SCM_CAR (lst), SCM_EOL); + loc = SCM_CDRLOC (*loc); + lst = SCM_CDR(lst); + } + return scm_values (scm_list_2 (pre, lst)); +} +#undef FUNC_NAME + + +SCM_DEFINE (scm_srfi1_split_at_x, "split-at!", 2, 0, 0, + (SCM lst, SCM n), + "Return two values (multiple values), being a list of the\n" + "elements before index @var{n} in @var{lst}, and a list of those\n" + "after. @var{lst} is modified to form those values.") +#define FUNC_NAME s_scm_srfi1_split_at +{ + size_t nn; + SCM upto = lst; + SCM *loc = &lst; + + for (nn = scm_to_size_t (n); nn != 0; nn--) + { + SCM_VALIDATE_CONS (SCM_ARG1, upto); + + loc = SCM_CDRLOC (upto); + upto = SCM_CDR (upto); + } + + *loc = SCM_EOL; + return scm_values (scm_list_2 (lst, upto)); +} +#undef FUNC_NAME + + SCM_DEFINE (scm_srfi1_take_right, "take-right", 2, 0, 0, (SCM lst, SCM n), "Return the a list containing the @var{n} last elements of\n" |