[racket-dev] racket/match is broken

From: Robby Findler (robby at eecs.northwestern.edu)
Date: Wed Oct 5 22:55:11 EDT 2011

Why wouldn't you write that match like this:

(match ..
  [`(+ ,lhs ,rhs) (make-plus (parse lhs) (parse rhs))]
  [`(fun (,(? symbol arg) ...) ,body) (make-fun arg (parse body))])

Robby

On Wed, Oct 5, 2011 at 9:48 PM, Jay McCarthy <jay.mccarthy at gmail.com> wrote:
> Okay. I think it is strange, but feel free to do that and revert my
> change. Apologies for the confusion.
>
> The use case I was actually doing was like this:
>
> [(list '+ (app parse lhs) (app parse rhs))
>  ...]
> [(list 'fun (list (? symbol? arg) ...) (app parse body))
>  ...]
>
> And when you gave it a '(fun () ...) it would try to parse the '() in
> the fun as the lhs of a + and then throw an exception and crash the
> whole match.
>
> Jay
>
> On Wed, Oct 5, 2011 at 7:39 PM, Sam Tobin-Hochstadt <samth at ccs.neu.edu> wrote:
>> On Wed, Oct 5, 2011 at 5:13 PM, Jay McCarthy <jay.mccarthy at gmail.com> wrote:
>>>
>>> Basically, it calls the app function on the second element of the list
>>> even though the head of the list has failed to pattern match.
>>
>> This is not a bug.  `match' makes no guarantee about the order in
>> which it checks elements of the pattern.  If it were to try to support
>> this kind of use case, it would have to specify how many times it
>> would call each function that might be embedded in a match, which
>> requires a detailed semantics of backtracking in the matcher, and lock
>> in a particular implementation.
>>
>> I will clarify the documentation to say that you shouldn't use
>> functions that aren't safe to call 0, 1, or more times, in various
>> orders, inside `match' patterns.
>> --
>> sam th
>> samth at ccs.neu.edu
>>
>
>
>
> --
> Jay McCarthy <jay at cs.byu.edu>
> Assistant Professor / Brigham Young University
> http://faculty.cs.byu.edu/~jay
>
> "The glory of God is Intelligence" - D&C 93
>
> _________________________________________________
>  For list-related administrative tasks:
>  http://lists.racket-lang.org/listinfo/dev



Posted on the dev mailing list.