[cl-ppcre-devel] Buffered multi-line question

Edi Weitz edi at agharta.de
Thu Oct 14 17:20:04 UTC 2004


On Thu, 14 Oct 2004 18:18:46 +0200, Sébastien Saint-Sevin <seb-cl-mailist at matchix.com> wrote:

>>   (defvar *max-start-pos* 0)
>>
>>   (defun my-filter (pos)
>>     (and (< pos *max-start-pos*) pos))
>>
>>   (scan '(:sequence ... (:filter my-filter 0) ...) target)

> The majority of regex I'm using are unfortunately not optimizable.

Are you sure?

> Going back to my buffer. Let's say I'm looking at ten lines at a
> time. I want start to occurs only at first line and I can do it with
> filters (that's great !). But the engine will still continue moving
> forward into the string for the nine remaining lines, and it will
> call my filter for each position in each line to just get nil
> everytime.

I'm sorry but I still don't fully understand your problem. Could you
give an example with actual code and data?

> So the question for forcing a full abort immediatly and not calling
> so many times the filter.  In fact this is the case for all filter
> that once it has returned nil, will return nil forever (and are in a
> position in the parse tree where they can't be shadowed by some
> backtracking!).

Are you using DO-SCANS or another loop construct? How about this?

  (defvar *max-start-pos* 0)

  (defvar *stop-immediately* nil)

  (defun my-filter (pos)
    (cond ((< pos *max-start-pos*)
            pos)
          (t
            (setq *stop-immediately* t)
            nil)))

  (let (*stop-immediately*)
    (do-scans (...)
      (when *stop-immediately* (return))
      ;;; your stuff here
      ))

So once *STOP-IMMEDIATELY* is set by your filter the loop will be
instantly exited.

Cheers,
Edi.





More information about the Cl-ppcre-devel mailing list