On Wed, Dec 30, 2020 at 2:24 PM David Storrs <david.sto...@gmail.com> 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 racket-users+unsubscr...@googlegroups.com. 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.