In summary these are some example transitions this change makes:
'a || => ||: 'a
proc:Send() => proc():Send
The intended syntax for closures is to put the lifetime bound not at the front
but rather in the list of bounds. Currently there is no official support in the
AST for bounds that are not 'static, so this case is currently specially handled
in the parser to desugar to what the AST is expecting. Additionally, this moves
the bounds on procedures to the correct position, which is after the argument
list.
The current grammar for closures and procedures is:
procedure := 'proc' [ '<' lifetime-list '>' ] '(' arg-list ')'
[ ':' bound-list ] [ '->' type ]
closure := [ 'unsafe' ] ['<' lifetime-list '>' ] '|' arg-list '|'
[ ':' bound-list ] [ '->' type ]
lifetime-list := lifetime | lifetime ',' lifetime-list
arg-list := ident ':' type | ident ':' type ',' arg-list
bound-list := bound | bound '+' bound-list
bound := path | lifetime
This does not currently handle the << ambiguity in `Option<<'a>||>`, I am
deferring that to a later patch. Additionally, this removes the support for the
obsolete syntaxes of ~fn and &fn.
Closes #10553
Closes #10767
Closes #11209
Closes #11210
Closes #11211
36 lines
882 B
Rust
36 lines
882 B
Rust
// Copyright 2012-2014 The Rust Project Developers. See the COPYRIGHT
|
|
// file at the top-level directory of this distribution and at
|
|
// http://rust-lang.org/COPYRIGHT.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
|
// option. This file may not be copied, modified, or distributed
|
|
// except according to those terms.
|
|
|
|
type ErrPrinter<'a> = |&str, &str|: 'a;
|
|
|
|
fn example_err(prog: &str, arg: &str) {
|
|
println!("{}: {}", prog, arg)
|
|
}
|
|
|
|
fn exit(print: ErrPrinter, prog: &str, arg: &str) {
|
|
print(prog, arg);
|
|
}
|
|
|
|
struct X<'a> {
|
|
err: ErrPrinter<'a>
|
|
}
|
|
|
|
impl<'a> X<'a> {
|
|
pub fn boom(self) {
|
|
exit(self.err, "prog", "arg");
|
|
}
|
|
}
|
|
|
|
pub fn main(){
|
|
let val = X {
|
|
err: example_err,
|
|
};
|
|
val.boom();
|
|
}
|