From: Keith Packard Date: Thu, 4 Jan 2018 10:25:45 +0000 (-0800) Subject: altos/scheme: Add builtin list-tail X-Git-Tag: 1.8.5~1^2~2^2~22 X-Git-Url: https://git.gag.com/?a=commitdiff_plain;h=a6e01e7aafb1d1fdb15d633ec23d8fe51afd15df;p=fw%2Faltos altos/scheme: Add builtin list-tail This is used enough to warrant a builtin, rather than lisp implementation Signed-off-by: Keith Packard --- diff --git a/src/scheme/ao_scheme_builtin.c b/src/scheme/ao_scheme_builtin.c index 0b84a89a..1bfe6942 100644 --- a/src/scheme/ao_scheme_builtin.c +++ b/src/scheme/ao_scheme_builtin.c @@ -230,6 +230,31 @@ ao_scheme_do_list_copy(struct ao_scheme_cons *cons) return ao_scheme_cons_poly(new); } +ao_poly +ao_scheme_do_list_tail(struct ao_scheme_cons *cons) +{ + ao_poly list; + int32_t v; + + if (!ao_scheme_check_argc(_ao_scheme_atom_list2dtail, cons, 2, 2)) + return AO_SCHEME_NIL; + if (!ao_scheme_check_argt(_ao_scheme_atom_list2dtail, cons, 0, AO_SCHEME_CONS, 1)) + return AO_SCHEME_NIL; + list = ao_scheme_arg(cons, 0); + v = ao_scheme_arg_int(_ao_scheme_atom_list2dtail, cons, 1); + if (ao_scheme_exception) + return AO_SCHEME_NIL; + while (v > 0) { + if (!list) + return ao_scheme_error(AO_SCHEME_INVALID, "%v: ran off end", _ao_scheme_atom_list2dtail); + if (!ao_scheme_is_cons(list)) + return ao_scheme_error(AO_SCHEME_INVALID, "%v: invalid list", _ao_scheme_atom_list2dtail); + list = ao_scheme_poly_cons(list)->cdr; + v--; + } + return list; +} + ao_poly ao_scheme_do_quote(struct ao_scheme_cons *cons) { diff --git a/src/scheme/ao_scheme_builtin.txt b/src/scheme/ao_scheme_builtin.txt index 4739f121..7298add7 100644 --- a/src/scheme/ao_scheme_builtin.txt +++ b/src/scheme/ao_scheme_builtin.txt @@ -12,6 +12,7 @@ all f_lambda cons all f_lambda last all f_lambda length all f_lambda list_copy list-copy +all f_lambda list_tail list-tail all nlambda quote QUASI atom quasiquote QUASI atom unquote