| Deutsch English Français Italiano |
|
<103sigm$1p8bb$1@dont-email.me> View for Bookmarking (what is this?) Look up another Usenet article |
Path: nntp.eternal-september.org!news.eternal-september.org!eternal-september.org!.POSTED!not-for-mail
From: "B. Pym" <Nobody447095@here-nor-there.org>
Newsgroups: comp.lang.lisp
Subject: Re: Newbie: reverse or append?
Date: Sun, 29 Jun 2025 23:33:43 -0000 (UTC)
Organization: A noiseless patient Spider
Lines: 64
Message-ID: <103sigm$1p8bb$1@dont-email.me>
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Injection-Date: Mon, 30 Jun 2025 01:33:43 +0200 (CEST)
Injection-Info: dont-email.me; posting-host="73560aae7c7612a4b7ed1e3f886ec647";
logging-data="1876331"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX18pssPJX3EnqQLbTutem2qb"
User-Agent: XanaNews/1.18.1.6
Cancel-Lock: sha1:YbAFgqB3ozWy5WmLZ2GUFZTzswg=
Pascal Costanza wrote:
> Tyro wrote:
> > I wrote two recursive versions of a function that takes a list, an
> > index and an empty list and returns three values:
> > 1. The list of elements before the element at the given index
> > 2. The element at the given index
> > 3. The rest of the list after the given index
>
> > For example, (test1 '(a b c d e f) 3 nil) would return
> > (A B C)
> > D
> > (E F)
>
> > The functions are:
> > (defUn test1 (lst ind bef)
> > (cond ((null lst) (values (reverse bef) nil (cdr lst)))
> > ((= ind 0) (values (reverse bef) (car lst) (cdr lst)))
> > (t (test1 (cdr lst) (- ind 1) (cons (car lst) bef)))))
>
> > (defUn test2 (lst ind bef)
> > (cond ((null lst) (values bef nil (cdr lst)))
> > ((= ind 0) (values bef (car lst) (cdr lst)))
> > (t (test2 (cdr lst) (- ind 1) (append bef (list (car
> > lst)))))))
>
> It seems to me that you are trying to program in Scheme instead of
> Common Lisp. ;)
>
> Here is a version of what you are trying to do using Common Lisp's LOOP
> facility:
>
> (defun test3 (list index)
> (loop with at
> for element in list
> for i = 0 then (1+ i)
> if (< i index) collect element into before
> else if (= i index) do (setf at element)
> else if (> i index) collect element into after
> finally return (values before at after)))
If one uses a Lispy language instead of CL, he can simply
use recursion instead of a macro whose source measures
60 kilobytes.
Gauche Scheme
(define (test xs i :optional (before '()))
(if (zero? i)
(values (reverse before) (car xs) (cdr xs))
(test (cdr xs) (- i 1) (cons (car xs) before))))
gosh> (test '(a b c d e f) 5)
(a b c d e)
f
()
gosh> (test '(a b c d e f) 3)
(a b c)
d
(e f)
gosh> (test '(a b c d e f) 0)
()
a
(b c d e f)