Deutsch   English   Français   Italiano  
<vatj2b$m815$1@dont-email.me>

View for Bookmarking (what is this?)
Look up another Usenet article

Path: ...!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail
From: "B. Pym" <Nobody447095@here-nor-there.org>
Newsgroups: comp.lang.lisp,comp.lang.scheme
Subject: Re: getting list of keys
Date: Fri, 30 Aug 2024 23:02:36 -0000 (UTC)
Organization: A noiseless patient Spider
Lines: 53
Message-ID: <vatj2b$m815$1@dont-email.me>
References: <vath1c$ltbf$1@dont-email.me>
Injection-Date: Sat, 31 Aug 2024 01:02:37 +0200 (CEST)
Injection-Info: dont-email.me; posting-host="c51450164ff44e4b4c9e62a2e4bb2981";
	logging-data="729125"; mail-complaints-to="abuse@eternal-september.org";	posting-account="U2FsdGVkX19dcVM++E5DgWj0xZZ/RJDp"
User-Agent: XanaNews/1.18.1.6
Cancel-Lock: sha1:z6rJMTSN070JQ/QS+FCfhVK4LQY=
Bytes: 2240

B. Pym wrote:

> > > an `update' function for the mp3 database.
> > > I need a function for doing something like this with a list:
> > > 
> > > * (xxxx (list :artist "something" :song "sss"))
> > > => (:artist :song)
> > > 
> > > Thanks in advance, and sorry for my bad english.
> > > --
> > > Pablo.
> > 
> > CL-USER> (loop :for (x y) :on (list :artist "something" :song "sss") :by #'cddr
> >             :collect x)
> > (:ARTIST :SONG)
> 
> Gauche Scheme and Racket using unfold from SRFI-1.
> 
> (use srfi-1)  ;; unfold for Gauche
>   or
> (require srfi/1)  ;; unfold for Racket
> 
> (unfold null? car cddr '(:artist "something" :song "sss"))
>   ===>
> (:artist :song)

Rob Warnock wrote:

> The one place I find myself frequently using CDD*R
> is in destructuring lists by "gulps" in LOOP, e.g.:
> 
>     > (defun group-by-triples (list)
>         (loop for (a b c) on list by #'cdddr
>           collect (list a b c)))
> 
>     GROUP-BY-TRIPLES
>     > (group-by-triples '(0 1 2 3 4 5 6 7 8 9 10 11 12))
> 
>     ((0 1 2) (3 4 5) (6 7 8) (9 10 11) (12 NIL NIL))

Gauche Scheme

(use srfi-1) ;; unfold

"take*" and "drop*" are tolerant; they don't raise an
exception when the list is too short.

(define (group-by-triples xs)
  (unfold null? (cut  take* <> 3 #t) (cut  drop* <> 3) xs))

(group-by-triples (iota 13))
  ===>
((0 1 2) (3 4 5) (6 7 8) (9 10 11) (12 #f #f))