Rocksolid Light

News from da outaworlds

mail  files  register  groups  login

Message-ID:  

The ripest fruit falls first. -- William Shakespeare, "Richard II"


comp / comp.lang.lisp / Re: drop it

SubjectAuthor
o Re: drop itB. Pym

1
Subject: Re: drop it
From: B. Pym
Newsgroups: comp.lang.lisp
Organization: A noiseless patient Spider
Date: Thu, 8 Aug 2024 16:42 UTC
Path: eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail
From: Nobody447095@here-nor-there.org (B. Pym)
Newsgroups: comp.lang.lisp
Subject: Re: drop it
Date: Thu, 8 Aug 2024 16:42:46 -0000 (UTC)
Organization: A noiseless patient Spider
Lines: 67
Message-ID: <v92si3$40j1$1@dont-email.me>
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Injection-Date: Thu, 08 Aug 2024 18:42:47 +0200 (CEST)
Injection-Info: dont-email.me; posting-host="623536926260db1f505ba92f19951445";
logging-data="131681"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX18NThrIjGMSAUy84m+lBsln"
User-Agent: XanaNews/1.18.1.6
Cancel-Lock: sha1:nDf9w5sVNqx7xldo+pO+qISAp8I=
View all headers

Chris Russell wrote:

> > > > Drop every N'th element from a list.
> > > > Example:
> > > > * (drop '(a b c d e f g h i k) 3)
> > > > (A B D E G H K)
> >
> > > I'm guilty responding to a spammer, who doesn't help Lisp or OCaml by
> > > posting wrong statements about it, so I'll solve your problem:
> >
> > > (defun drop (list n)
> > > (loop for item in list
> > > for i = 1 then (1+ i)
> > > when (/= (mod i n) 0) collect item))
> >
> > > Of course, in Haskell I can write it like this:
> >
> > > myDrop list n=[list!!x|x<-[0..length list-1], mod (1+x) n/=0]
> >
> > > and I'm sure this is not the shortest solution. But for me it is more
> > > difficult to develop pure functional algorithms than using Lisp.
> >
> > It is not that difficult.
> >
> > (defun drop (list n)
> > (labels ((drop-aux (list i)
> > (cond ((null list) nil)
> > ((= i 1) (drop-aux (rest list) n))
> > (t (cons (first list)
> > (drop-aux (rest list) (1- i)))))))
> > (drop-aux list n)))
> >
> > There are many extra points to get for a version using 'Series'.
> > A few extra points for a tail-recursive version.
> >
> > Or you can take this one:
> >
> > (defun every-nth (n)
> > (let ((i n))
> > (lambda ()
> > (prog1 (= i 1)
> > (decf i)
> > (when (zerop i)
> > (setf i n))))))
> >
> > Above returns a function that returns T for every n-th call.
> >
> > (defun drop (list n)
> > (remove-if (every-nth n) list))
> >
> > --http://lispm.dyndns.org
>
> Obligatory 1 line solution using map__:
>
> (defun remove-nth(n list)
> (mapcan (let ((tick 0))(lambda(x) (when (/= 0 (rem (incf tick) n))
> (list x)))list))

newLISP

(define (remove-nth n lst , i)
(clean (fn() (= 0 (mod (++ i) n))) lst))

(remove-nth 3 '(a b c d e f g h i j k))

(a b d e g h j k)

1

rocksolid light 0.9.8
clearnet tor