Deutsch   English   Français   Italiano  
<vatlqs$mk6q$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: Emacs Lisp's "mapconcat" in Common Lisp?
Date: Fri, 30 Aug 2024 23:49:49 -0000 (UTC)
Organization: A noiseless patient Spider
Lines: 66
Message-ID: <vatlqs$mk6q$1@dont-email.me>
References: <vatk56$md9s$1@dont-email.me>
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Injection-Date: Sat, 31 Aug 2024 01:49:50 +0200 (CEST)
Injection-Info: dont-email.me; posting-host="f26fadc2861a453a8f872ea6dc048189";
	logging-data="741594"; mail-complaints-to="abuse@eternal-september.org";	posting-account="U2FsdGVkX19qMnUmbORdmVyLRsFXMNRs"
User-Agent: XanaNews/1.18.1.6
Cancel-Lock: sha1:pqBUrB3V6J+Z06+p6FS8kzl6nac=
Bytes: 2709

B. Pym wrote:

> Pascal Bourguignon wrote:
> 
> > Teemu Likonen <tlikonen@iki.fi> writes:
> > 
> > > It's a Common Lisp newbie here; I'm more experienced in Emacs Lisp. I
> > > wonder if there is similar function in CL like Emacs Lisp's "mapconcat":
> > > 
> > >     (mapconcat 'identity '("one" "two" "three") "-")
> > >     => "one-two-three"
> > > 
> > > I can do the same in CL with this:
> > > 
> > >     (let ((list '("one" "two" "three")))
> > >       (format nil "~{~a-~}~a" (butlast list) (car (last list))))
> > > 
> > > But I have a feeling that there could be a more elegant way. Is there?
> > 
> > Yes, write:       (mapconcat 'identity '("one" "two" "three") "-") ; elegant!
> > 
> > 
> > Of course, with:
> > 
> > 
> > (defun mapconcat (fun list sep)
> >    (when list
> >       (let ((~sep (with-output-to-string (*standard-output*)
> >                      (map nil (lambda (ch) (princ (if (char= #\~ ch) "~~" ch)))
> > sep))))
> >        (format nil (format nil "~~A~~{~A~~A~~}" ~sep)
> >                (funcall fun (first list))
> >                (mapcar fun (rest list))))))
> > 
> > 
> > 
> > (mapconcat 'identity '("one" "two" "three") "-")
> > --> "one-two-three"
> > 
> > (mapconcat (lambda (x) (concatenate 'string "[" x "]")) '("one" "two" "three") "
> > ~")
> > --> "[one]~[two]~[three]"
> 
> Gauche Scheme:
> 
> (define (mapconcat fun lst sep)
>   (reduce-right
>     (^(a b)
>       (apply string-append (map x->string (list a sep b))))
>     ""
>     (map fun lst)))
> 
> (mapconcat values '(one "two" three) '-)
>   ===>
> "one-two-three"
> 
> (mapconcat square '(2 3 4) '---)
>   ===>
> "4---9---16"

Shorter:

(define (mapconcat fun lst sep)
  (string-join (map (compose x->string fun) lst) (x->string sep)))