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 <cleme...@brinckerhoff.org> 
> 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
> Rust-dev@mozilla.org
> https://mail.mozilla.org/listinfo/rust-dev
> 
> _______________________________________________
> Rust-dev mailing list
> Rust-dev@mozilla.org
> https://mail.mozilla.org/listinfo/rust-dev

_______________________________________________
Rust-dev mailing list
Rust-dev@mozilla.org
https://mail.mozilla.org/listinfo/rust-dev

Reply via email to