• Re: cl-ppcre question

    From B. Pym@21:1/5 to Madhu on Wed Aug 7 19:21:42 2024
    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)))))))

    newLISP

    (define (parse-rgb-line s)
    (find-all
    {(\d+)|(\S.*)}
    (trim s)
    (or (int $0) $0)))

    (parse-rgb-line "119 136 153 light slate gray ")

    (119 136 153 "light slate gray")

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)