On Wed, Dec 30, 2020 at 2:24 PM David Storrs <[email protected]> wrote:
>
> First off, is there a way to make ... in a pattern match non-greedily?  i.e., 
> match as *few* elements as possible instead of as many?

As far as I know, no. However, if your first example is really
illustrative of what you're trying to do, you could just use a `cons`
pattern instead of a `list` pattern:

(match (list '(a b c) '(d e c))
  [(list (cons _ xs) (cons _ ys))
   #:when (equal? xs ys)
   'ok]
  [else 'nope])
=> 'nope

And that makes a nice segue into your second question:

> Second, is there a way to make one pattern refer to an earlier pattern in the 
> same match clause?

If we're limiting this to variable patterns, then yes. The
documentation says: "If an id is used multiple times within a pattern,
the corresponding matches must be the same according to
(match-equality-test), except that instances of an id in different or
and not sub-patterns are independent." So, assuming that
`(match-equality-test)` is `equal?` -- which is the default -- the
above could also be written as:

(match (list '(a b c) '(d e c))
  [(list (cons _ xs) (cons _ xs))
   'ok]
  [else 'nope])

Similarly, your second example could be written as:

(match '(a b c c d)
  [(list _ ... x x _ ...)
   'ok]
  [else 'nope])


However, I have seen some issues with this feature (using the same var
pattern multiple times to get an equality restriction). Most recently:
https://github.com/racket/racket/issues/3425

- Jon

-- 
You received this message because you are subscribed to the Google Groups 
"Racket Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/racket-users/CAKfDxxzm-hq8DRVF5-Ur_Q%3DdxCeQVeARERjKzxQ%2BVUU-18dsrg%40mail.gmail.com.

Reply via email to