Summary: Lambda syntax

Collin Fagan collin.fagan at gmail.com
Thu Mar 18 18:09:35 PDT 2010


Hi Stefan,

I was trying to get a little feedback on some of my ideas but I guess
it got missed.

Can we use : in the lambda syntax? Off the top of my head I think it's
only used in the for-each loop and the ternary operator.

If : is up for grabs then my next question is: can we infix this
operator instead of prefixing it?

Examples: (borrowed from an earlier post by Rémi Forax)

A function that takes an int and returns an int:

int(int)

becomes

int:(int)

and ...

A function that takes an int and returns nothing:
void:(int)

A function that takes two ints and returns an int:
int:(int, int)

A function that throws an Exception:
int:(int) throws Exception

A function that takes a function that throws an Exception:
int:(int:(int) throws Exception)

Grammar:
ResultType :( TypeList ) throws ExceptionList

This syntax reads left to right in a way that is similar to method
signatures, with the method name replaced by a ':' .

Now when we get to the curry examples I would like to customize the
assignment operator. Since I chose ':' how about using ':='   as the
"curry operator" ?

Examples: (borrowed from an earlier post by Bob Foster)

class A {
 void foo(int x) { ... }
 void :(int) fun = { ... }
}

// curry examples
A a = new A();
void:() f1 := a.foo(2);
void:() f2 := a.foo();
void:() f3 := A.fun(2);

Finally, to stay with the theme, invoking a lambda would use '::'

f1::();
f2::();
f3::();

Optionally this syntax could be: f1.:(); or f1:.(); but I found
neither of those particularly compelling.

I *think* the : is no harder to type then the #. (At least on the
English keyboards I'm used to.)
The := construct is used in other languages (like Pascal, Eiffel and
Smalltalk) but admittedly not for curring.
The :: construct is used in C++, but again, not in the way I plan on using it.

I could continue to flesh this out into a real proposal if people
found the syntax compelling. If I've committed any egregious sin in my
post I apologize.

Thank you,

- Collin

On Thu, Mar 18, 2010 at 6:09 PM, Stefan Schulz <schulz at the-loom.de> wrote:
> So I summed up the proposed lambda syntaxes, hopefully picked all of
> them from the list. The summary is below, and the nicer to read document
> version is as before at the following URL:
>   http://docs.google.com/View?id=ddhp95vd_15gqnv8xqm
>
> In case of mistakes or missed proposals, let me know.
>
> Cheers,
> Stefan
>
>
> 0. Common syntax
> Block:
>     { BlockStatements }
>
> BlockStatements:
>     BlockStatement
>     BlockStatements BlockStatement
>
> BlockStatement:
>     LocalVariableDeclarationStatement
>     ClassDeclaration
>     Statement
>
> ParameterList:
>     Parameter
>     Parameter, ParameterList
>
> Parameter:
>     Type Identifier
>
> 1. Straw-man, latest
> Proposes two lambda definitions: lambda expressions and statements.
> Return type is inferred and throws meant to be transparent.
>
> LambdaExpression:
>     # ( ParameterListopt ) ( Expression )
>     # ( ParameterListopt ) Block
>
> Examples:
> #() ( 7 );
> #(Event e) { handle(e); }
> #(File f) { return f.getName(); };
> #(#R(A)(throws E) l, A a) ( #() ( l.(a) ) );
>
>
> 2. Rémy Forax, 05 Jan 2010
> Proposes to use a keyword lambda instead of #.
>
> LambdaExpression:
>     lambda ( ParameterListopt ) ( Expression )
>     lambda ( ParameterListopt ) Block
>
> Examples:
> lambda() ( 7 );
> lambda(Event e) { handle(e); };
> lambda(File f) { return f.getName(); };
> lambda(#R(A)(throws E) l, A a) ( lambda() ( l.(a) ) );
>
> 3. Peter Levart, 26 Jan 2010
> LambdaExpression:
>     # ( ParametersListopt ResultParameteropt ) Block
>
> ResultParameter:
>     : Parameter
>
> Examples:
> #(: int i) { i = 7 };
> #(Event e) { handle(e); };
> #(File f : String s) { s = f.getName(); };
> #(#(A: R throws E) l, A a : #(: R throws E) c) { c = #(: R r) { r =
> l.(a); }; };
>
> 4. Peter Levart, 1 Feb 2010
> LambdaExpression:
>     # ( ParameterListopt -> ReturnTypeopt ) Block
>
> Examples:
> #(->int) { return 7; };
> #(Event e -> void) { handle(e); };
> #(File f -> String) { return f.getName(); };
> #(#(A -> R throws E) l, A a
>   -> #(-> R throws E)) { return #(->R) { return l.(a); }; };
>
> 5. Neal Gafter, 9 Feb 2010
> LambdaExpression:
>     ( ParameterListopt ) -> Expression
>     ( ParameterListopt ) -> Block
>
> Examples:
> () -> 7;
> (Event e) -> { handle(e); };
> (File f) -> { return f.getName(); };
> ((A) -> R throws E l, A a) -> () -> l.(a);
>
> 6. BGGA
> LambdaExpression:
>     { ParameterListopt => BlockStatementsopt Expressionopt }
>
> Examples:
> { => 7 }
> { Event e => handle(e); };
> { File f => f.getName() };
> { { A => R throws E } l, A a => { => l.(a) } };
>
> 7. Peter Levart, 2 Mar 2010
> LambdaExpression:
>     ( ParameterListopt -> BlockStatementsopt Expression )
>
> Examples:
> ( -> 7 );
> ( Event e -> handle(e); void };
> ( File f -> f.getName() );
> ( (A -> R throws E ) l, A a -> ( -> l.(a) ) );
>
> 8. Howard Lovatt, 11 Mar 2010
> LambdaExpression:
>     new #< Signature > ( BlockStatementsopt Expression )
> Signature:
>     ReturnType ( ParameterListopt ) Throwsopt
>
> Examples:
> new #< int() > (7);
> new #< void(Event e) > (handle(e); null);
> new #< String(File f) > (f.getName());
> #< #< R() throws E >( #< R( A ) throws E > l, A a ) >
>   ( new #< R() throws E >()( l.( a ) );
>
> 9. C++ (via Stephen Colebourne), 14 Mar 2010
> (translated to lambda-use)
>
> LambdaExpression:
>     [ Accessorsopt ] ParameterDeclopt ReturnTypeDeclopt {
> BlockStatementsopt }
>
> ParameterDecl:
>     ( ParameterList )
>
> ReturnTypeDecl:
>     -> ReturnType
>
> Accessors:
>     &
>     =
>     Closings
>
> Closings:
>     Closing
>     Closing, Closings
>
> Closing:
>     & Identifier
>     Identifier
>     this
>
> Examples:
> [] { return 7; };
> [] (Event e) { handle(e); };
> [] (File f) { return file.getName(); };
> [] (R (*l)(A), A a) { return []{ return l.(a); };
>
> 10. Rémi Forax, 14 Mar 2010
> LambdaExpression:
>     ( ParameterListopt ) ( Expression )
>     ( ParameterListopt ) Block
>
> Examples:
> () ( 7 );
> (Event e) { handle(e); }
> (File f) { return f.getName(); };
> (R(A)(throws E) l, A a) ( () ( l.(a) ) );
>
> 11. Peter Levart, 17 Mar 2010
> LambdaExpression:
>     ( ParameterListopt : Expression )
>     { ParameterListopt : BlockStatements }
>
> FunctionInvocationExpression:
>     FunctionTypedExpression [ ExpressionListopt ]
>
> Examples:
> (:7);
> { Event e : handle(e); };
> { File f : return f.getName(); };
> ( [ A : R throws E ] l, A a : (: l[a]) );
>
>
>
>


More information about the lambda-dev mailing list