> I haven't looked very deep into this, but it seems the replacement
> lambda is called with the same match object for every substitution.
> You don't seem to distinguish between the different matches in any
> way - the result of the lambda will always be the same.

Thanks, felix for having a glimpse. And an even bigger 'thank you' for
initializing and sharing chicken!

Problem solved!
`irregex-match-valid-index?` does not tell us whether the match
happened at a certain index, and the documentation even says so:
"Returns #t iff [sic] the index-or-name named submatch or index is
defined in the match object."
Valid means defined here - not matched.
I have written a function that dumps the content of the match object.
Of course all the indices appearing in the dump are defined as
indicated by *. Actually I am not quite sure what the purpose of
`irregex-match-valid-index?` is.

Cheers!

#!/usr/bin/env -S csi -s

(import (chicken format)
        (chicken irregex)
        (chicken string)
        srfi-1)

(define (dump match-obj port)
  (let ((match? (irregex-match-data? match-obj)))
    (when match?
      (fprintf port
               "match-data? ~A~N"
               match?)
      (letrec ((num (irregex-match-num-submatches match-obj))
               (names (irregex-match-names match-obj))
               (iter (lambda (index)
                       (when (<= index num)
                         (fprintf port
                                  "~A ~A, ~A: '~A'~N"
                                  (if (irregex-match-valid-index?
                                       match-obj index)
                                      #\*
                                      #\space)
                                  index
                                  (string-intersperse
                                   (map car
                                        (filter (lambda (pair)
                                                (= index (cdr pair)))
                                              names))
                                   ", ")
                                  (irregex-match-substring match-obj
                                                           index))
                         (iter (add1 index))))))
        (fprintf port
                 "num-submatches: ~A~N"
                 num)
        (iter 0)))
    (display (make-string 32 #\-) port)
    (newline port))
  (void))

(display
 (irregex-replace/all
  '(: bow
      (or (=> "f" (w/nocase "fred"))
          (=> "w" (w/nocase "wilma")))
      eow)
  "fred dino wilma barney"
  (lambda (match-obj)
    (dump match-obj (current-output-port))
    (letrec ((iter (lambda (alist)
                     (unless (null? alist)
                       (let ((pair (car alist)))
                         (assert (pair? pair))
                         (if (irregex-match-substring match-obj
                                                      (cdr pair))
                             (let ((name (car pair)))
                               (assert (string? name))
                               (cond
                                ((string=? name "f") "Wilma")
                                ((string=? name "w") "Fred")
                                (else (error "unknown named match"
                                             name))))
                             (iter (cdr alist))))))))
      (iter (irregex-match-names match-obj))))))
(newline)

Reply via email to