Skip to content

Commit eaf9e05

Browse files
committed
Make 'lambda(...) -> ...' parse as a type
1 parent 4e9b8a2 commit eaf9e05

File tree

2 files changed

+10
-26
lines changed

2 files changed

+10
-26
lines changed

doc/tutorial/func.md

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,10 @@ expected to return.
2525

2626
## Closures
2727

28-
FIXME Either move entirely to fn~/fn@ nomenclature, or fix compiler to
29-
accept lambda as a type
30-
3128
Normal Rust functions (declared with `fn`) do not close over their
3229
environment. A `lambda` expression can be used to create a closure.
3330

34-
fn make_plus_function(x: int) -> fn@(int) -> int {
31+
fn make_plus_function(x: int) -> lambda(int) -> int {
3532
lambda(y: int) -> int { x + y }
3633
}
3734
let plus_two = make_plus_function(2);

src/comp/syntax/parse/parser.rs

Lines changed: 9 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -299,7 +299,7 @@ fn parse_ty_fn(proto: ast::proto, p: parser) -> ast::ty_ {
299299
ret ast::ty_fn(proto, inputs.node, ret_ty, ret_style, constrs);
300300
}
301301

302-
fn parse_ty_obj(p: parser, &hi: uint) -> ast::ty_ {
302+
fn parse_ty_obj(p: parser) -> ast::ty_ {
303303
fn parse_method_sig(p: parser) -> ast::ty_method {
304304
let flo = p.get_lo_pos();
305305
let proto: ast::proto = parse_method_proto(p);
@@ -320,7 +320,6 @@ fn parse_ty_obj(p: parser, &hi: uint) -> ast::ty_ {
320320
}
321321
let meths =
322322
parse_seq(token::LBRACE, token::RBRACE, none, parse_method_sig, p);
323-
hi = meths.span.hi;
324323
ret ast::ty_obj(meths.node);
325324
}
326325

@@ -475,7 +474,6 @@ fn parse_ret_ty(p: parser, n_args: uint) -> (ast::ret_style, @ast::ty) {
475474

476475
fn parse_ty(p: parser, colons_before_params: bool) -> @ast::ty {
477476
let lo = p.get_lo_pos();
478-
let hi = lo;
479477
let t: ast::ty_;
480478
// FIXME: do something with this
481479

@@ -518,7 +516,6 @@ fn parse_ty(p: parser, colons_before_params: bool) -> @ast::ty {
518516
} else if p.peek() == token::LPAREN {
519517
p.bump();
520518
if p.peek() == token::RPAREN {
521-
hi = p.get_hi_pos();
522519
p.bump();
523520
t = ast::ty_nil;
524521
} else {
@@ -530,54 +527,44 @@ fn parse_ty(p: parser, colons_before_params: bool) -> @ast::ty {
530527
if vec::len(ts) == 1u {
531528
t = ts[0].node;
532529
} else { t = ast::ty_tup(ts); }
533-
hi = p.get_hi_pos();
534530
expect(p, token::RPAREN);
535531
}
536532
} else if p.peek() == token::AT {
537533
p.bump();
538-
let mt = parse_mt(p);
539-
hi = mt.ty.span.hi;
540-
t = ast::ty_box(mt);
534+
t = ast::ty_box(parse_mt(p));
541535
} else if p.peek() == token::TILDE {
542536
p.bump();
543-
let mt = parse_mt(p);
544-
hi = mt.ty.span.hi;
545-
t = ast::ty_uniq(mt);
537+
t = ast::ty_uniq(parse_mt(p));
546538
} else if p.peek() == token::BINOP(token::STAR) {
547539
p.bump();
548-
let mt = parse_mt(p);
549-
hi = mt.ty.span.hi;
550-
t = ast::ty_ptr(mt);
540+
t = ast::ty_ptr(parse_mt(p));
551541
} else if p.peek() == token::LBRACE {
552542
let elems =
553543
parse_seq(token::LBRACE, token::RBRACE, some(token::COMMA),
554544
parse_ty_field, p);
555-
hi = elems.span.hi;
545+
let hi = elems.span.hi;
556546
t = ast::ty_rec(elems.node);
557547
if p.peek() == token::COLON {
558548
p.bump();
559-
t =
560-
ast::ty_constr(@spanned(lo, hi, t),
549+
t = ast::ty_constr(@spanned(lo, hi, t),
561550
parse_type_constraints(p));
562551
}
563552
} else if p.peek() == token::LBRACKET {
564553
expect(p, token::LBRACKET);
565554
t = ast::ty_vec(parse_mt(p));
566-
hi = p.get_hi_pos();
567555
expect(p, token::RBRACKET);
568556
} else if eat_word(p, "fn") {
569557
let proto = parse_fn_ty_proto(p);
570558
t = parse_ty_fn(proto, p);
571-
alt t { ast::ty_fn(_, _, out, _, _) { hi = out.span.hi; } }
572559
} else if eat_word(p, "block") {
573560
t = parse_ty_fn(ast::proto_block, p);
574-
alt t { ast::ty_fn(_, _, out, _, _) { hi = out.span.hi; } }
561+
} else if eat_word(p, "lambda") {
562+
t = parse_ty_fn(ast::proto_shared(ast::sugar_sexy), p);
575563
} else if eat_word(p, "obj") {
576-
t = parse_ty_obj(p, hi);
564+
t = parse_ty_obj(p);
577565
} else if p.peek() == token::MOD_SEP || is_ident(p.peek()) {
578566
let path = parse_path(p);
579567
t = ast::ty_path(path, p.get_id());
580-
hi = path.span.hi;
581568
} else { p.fatal("expecting type"); }
582569
ret parse_ty_postfix(t, p, colons_before_params);
583570
}

0 commit comments

Comments
 (0)