On Apr 25, 2013, at 8:34 AM, Lucian Branescu wrote:
> What about
>
> match bar {
> 0 .. (end - 1) = > ...
> }
>
> Shouldn't it include an expression?
Well, that's the question. Currently the grammar (and compiler) allow this. I'd
like to define a grammar here that nails down what's allowed a little more
tightly, rather than deferring entirely to (currently broken) constant
evaluation.
John
>
>
> On 25 April 2013 16:30, John Clements <[email protected]> wrote:
>
> On Apr 24, 2013, at 8:59 PM, Benjamin Striegel wrote:
>
>> > would it be reasonable to restrict the left- and right-hand-sides to
>> > simply be literals?
>>
>> Literals only? So then would the following be illegal?
>>
>> static END = 2;
>> ...
>> match bar {
>> 0 .. END => ...
>> }
>
> Good! I knew there were forms I was missing.
>
> so, from the grammar standpoint, we now have
>
> RANGE_LIT = LIT_INT | LIT_FLOAT | ident
>
> Other important ones that I'm missing?
>
> John
>
>>
>>
>> On Wed, Apr 24, 2013 at 6:36 PM, John Clements <[email protected]>
>> wrote:
>> Right now, the Rust parser accepts arbitrary expressions in certain pattern
>> locations, most notably on the right-hand-side of a ".." range pattern. In
>> talking to Patrick about this, though, he conjectured that it might be
>> pretty easy to explicitly define the grammar of constants. In fact… for
>> range patterns, would it be reasonable to restrict the left- and
>> right-hand-sides to simply be literals?
>>
>> I was poking through the source code, and I found some reference to the
>> possibility of these patterns being strings, which I found intriguing, but I
>> couldn't make it work:
>>
>> fn f() -> int { 14 }
>>
>> fn main() {
>> match ~"abc" {
>> "abb" .. "zzz" => io::println(~"success"),
>> _ => fail!()
>> }
>> }
>>
>> … yields this error:
>>
>> jclements-09740:~/tryrust clements> rustc /tmp/foo.rs
>> Running /usr/local/bin/rustc:
>> /tmp/foo.rs:5:8: 5:13 error: mismatched types: expected `~str` but found
>> `&'static str` (str storage differs: expected ~ but found &'static )
>> /tmp/foo.rs:5 "abb" .. "zzz" => io::println(~"success"),
>> ^~~~~
>> /tmp/foo.rs:5:17: 5:22 error: mismatched types: expected `~str` but found
>> `&'static str` (str storage differs: expected ~ but found &'static )
>> /tmp/foo.rs:5 "abb" .. "zzz" => io::println(~"success"),
>> ^~~~~
>> /tmp/foo.rs:5:8: 5:25 error: non-numeric type used in range
>> /tmp/foo.rs:5 "abb" .. "zzz" => io::println(~"success"),
>> ^~~~~~~~~~~~~~~~~
>> error: aborting due to 3 previous errors
>>
>>
>> … which seems to be suggesting that I use patterns like ~"abc", but those
>> don't work either…. they signal a type error using "uniq", which I think… is
>> a compiler bug. Erm. NOT IMPORTANT NOW.
>>
>> The real question is this: can we define a simple grammar for what's legal
>> on the lhs and rhs of a "range" pattern? perhaps simply
>>
>> pat = …
>> | range_lit DOTDOT range_lit
>> ...
>>
>> range_lit = LIT_INT | LIT_FLOAT
>>
>> ?
>>
>> Note that LIT_INT includes LIT_CHAR in this grammar.
>>
>> I haven't been able to find any legal Rust programs that would be made
>> illegal by this restriction, but perhaps there are funny corner cases: once
>> things get beyond the parser, I have no idea what kind of crazy stuff goes
>> on. :)
>>
>> As an additional benefit, it would eliminate bug/partial features such as
>> the one above and the ICE I reported earlier today.
>>
>> John
>>
>> _______________________________________________
>> Rust-dev mailing list
>> [email protected]
>> https://mail.mozilla.org/listinfo/rust-dev
>>
>> _______________________________________________
>> Rust-dev mailing list
>> [email protected]
>> https://mail.mozilla.org/listinfo/rust-dev
>
>
> _______________________________________________
> Rust-dev mailing list
> [email protected]
> https://mail.mozilla.org/listinfo/rust-dev
>
>
> _______________________________________________
> Rust-dev mailing list
> [email protected]
> https://mail.mozilla.org/listinfo/rust-dev
_______________________________________________
Rust-dev mailing list
[email protected]
https://mail.mozilla.org/listinfo/rust-dev