Apologies in advance.

An outbreak of Syntax Fever has struck the Mountain View offices today. One of the results was a total bikeshed proposal for a streamlined closure syntax. The idea is like this:

1. Closure expressions can be written `x -> expr` or `(x, y) -> expr`. This requires arbitrary lookahead to disambiguate from tuples. But it's relatively simple to write the code for it: you basically scan forward to find the matching parenthesis and then check the next token to see whether it is "->".

2. You may omit the last argument of a function that expects a closure using a syntax like the following:

    vec.iter: x { ... }

The general structure is ": args blk".  In BNF-like form, this looks like:

    Arguments := ID | "(" Argument0, ... ArgumentN ")"
    Argument := IrrefutablePattern
    Field := Expr "." ID
    Call := Expr "(" ... ")"
    TailCall := (Field | Call) ":" Arguments "{" ... "}"
    ClosureExpr := Arguments "->" Expr

Here are some examples:

    spawn: { ... }
    for vec.each: x { ... }
    let xs = xs.filter(x -> x.isEven());
    let ys = xs.map(x -> x * 2).filter(x -> x.isEven());
    let ys = xs.map: x {
        ...
        some_thing_complex(x)
    };

In all cases we would infer the @ vs ~ vs & as we do today.

I am not sure whether (x, y) -> x.isEven(y) is lightweight enough to replace _.isEven(_) in my heart, but it certainly looks better than {|x, y| x.isEven(y)}.



Niko
_______________________________________________
Rust-dev mailing list
[email protected]
https://mail.mozilla.org/listinfo/rust-dev

Reply via email to