One more syntax option allowing nice control abstraction

David Goodenough david.goodenough at linkchoose.co.uk
Mon Jun 20 14:52:23 PDT 2011


On Monday 20 Jun 2011, Reinier Zwitserloot wrote:
> Much bigger drawback you failed to mention: Breaks all java code that uses
> 'lambda' as an identifier name.
True, but this is always going to be true with new keywords.  The alternative
is to add yet more meanings to existing keywords (do) or finding a symbol that
is not yet used - both have their disadvantages.

David
> 
>  --Reinier Zwitserloot
> 
> 
> 
> On Mon, Jun 20, 2011 at 9:21 PM, Alexander Kochurov <
> 
> alexander.kochurov at maxifier.com> wrote:
> > David Goodenough suggested to use 'lambda' keyword:
> > "lambda()(5)
> > lambda(){return 5;}
> > 
> >  lambda(int x,int y) { if (x>y) return x; else return y; }"
> > 
> > Control abstraction may be introduced later in the following way:
> > 
> > to pass lambda to any method taking SAM type as it's last argument,
> > lambda body should be written in braces after closing bracket, lambda
> > argument names and types may be given before method parameters in
> > brackets, separated
> > by colon (if any):
> > 
> > sort(T[], Comparator<T>)  may be called with lambda comparator as
> > 
> > T[] array = ...
> > sort(T a, T b: array) {  // a & b are lambda arguments; array is
> > parameter of 'sort' method
> > 
> >     return a.compareTo(b);
> > 
> > }
> > 'lambda' may also be defined as a plain java function (but this won't
> > work cause type for SAM convertion should be known at compile time):
> > <T> T lambda(T t) { return t; }
> > * Pros:
> > IMHO, that syntax looks very java-ish: see for loop for maps definition
> > below
> > <K, V> void forEachEntry(Map<K, V> map, Function2<K, V>*/ f) {
> > 
> >     for (Iterator<Entry<K, V>> it =
> > 
> > map.entrySet().iterator();it.hasNext();) {
> > 
> >          Entry<K, V> entry = it.next();
> >          f.apply(entry.key, entry.value);
> >     
> >     }
> > 
> > }
> > Map<K, V> m = ...
> > forEachEntry(K k, V v: m) {
> > 
> >     System.out(k + " => " + v);
> > 
> > }
> > *drawback*: constructor cannot use that syntax: it would be
> > indistinguishable
> > from subclassing:
> > new Type() { /* is that labda body or anonymous class body? */ }
> > Lambdas should be constructed explicitely before passing it to
> > constructor: new Type(lambda() {return someValue;}) { /* this is not
> > lambda body, it's anonymous type body*/ };
> > 
> > Alexander Kochurov



More information about the lambda-dev mailing list