| 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))))))