Deutsch   English   Français   Italiano  
<103micc$8rr4$1@dont-email.me>

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

Path: 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: cl-ppcre question
Date: Fri, 27 Jun 2025 16:54:38 -0000 (UTC)
Organization: A noiseless patient Spider
Lines: 60
Message-ID: <103micc$8rr4$1@dont-email.me>
References: <v90hg5$3a46d$1@dont-email.me> <103ma3r$6vlm$1@dont-email.me>
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Injection-Date: Fri, 27 Jun 2025 18:54:38 +0200 (CEST)
Injection-Info: dont-email.me; posting-host="74a7a1c2fb42cf4b7c53d28ac874f0b2";
	logging-data="290660"; mail-complaints-to="abuse@eternal-september.org";	posting-account="U2FsdGVkX1+Z5hdwb8JlPR7HFyBdn/PT"
User-Agent: XanaNews/1.18.1.6
Cancel-Lock: sha1:11pQ8v4RAUjgzKEwRrutY3059fs=

B. Pym wrote:

> B. Pym wrote:
> 
> > Madhu wrote:
> > 
> > > >  I would like to parse color names in X11's rgb.txt.  They look like this:
> > > > 
> > > >  119 136 153             light slate gray
> > > >  119 136 153             LightSlateGray
> > > > 
> > > >  When parsing each line, I would like to get the color triplet, and the
> > > >  name.  I tried it like this:
> > > > 
> > > >  (let ((color-scanner
> > > >         (cl-ppcre:create-scanner
> > > >        "^ +([0-9]{0,2}) +([0-9]{0,2}) +([0-9]{0,2}) +([ a-zA-Z0-9]+)")))
> > > >    (cl-ppcre:scan-to-strings color-scanner " 1 2 3  foo bar baz    "))
> > > > 
> > > >  This gives #("1" "2" "3" "foo bar baz ") for the substrings.  How can
> > > >  I get rid of the trailing spaces?
> > > 
> > > Use the right tool for the job :)
> > > 
> > > (defun parse-rgb-line (string &key (start 0) end)
> > >   (multiple-value-bind (r endr)
> > >       (parse-integer string :start start :end end :junk-allowed t)
> > >     (multiple-value-bind (g endg)
> > >         (parse-integer string :start (1+ endr) :end end :junk-allowed t)
> > >       (multiple-value-bind (b endb)
> > >           (parse-integer string :start (1+ endg) :end end :junk-allowed t)
> > >         (let ((name-startpos
> > >                (position-if-not (lambda (c) (case c ((#\Tab #\Space) t)))
> > >                                 string :start (1+ endb))))
> > >           (values (format nil "#~2,'0X~2,'0X~2,'0X" r g b)
> > >                   (subseq string name-startpos end)))))))               
> 
> Gauche Scheme
> 
> (use srfi-13)  ;; string-trim-both
> 
> (define (parse-rgb-line line)
>   (with-input-from-string line
>     (lambda()
>       (append
>         (list (read) (read) (read))
>         (list (string-trim-both (read-line)))))))
> 
> (parse-rgb-line "  255  88 6   yes  no   ")
>   ===>
> (255 88 6 "yes  no")

Shorter:

(define (parse-rgb-line line)
  (with-input-from-string line
    (lambda()
      (list (read) (read) (read) (string-trim-both (read-line))))))