transparent lambda
Peter Levart
peter.levart at marand.si
Mon Jan 4 05:14:12 PST 2010
I checked the "Jump" and "UnmatchedTransfer" classes in the BGGA 2008-08-11 prototype on javac.info. The abstract Jump class has an abstract thread() method that returns a thread. I haven't looked into what code is generated by the prototype javac in such cases, but I suspect javac generates Jump sub-classes for particular non-local transfers. Do you perhaps know if there is a document describing the implementation details of the prototype regarding non-local transfers?
I may have unknowingly re-spawn the same idea once again, but does the BGGA prototype generate code with same semantics as described by Neal when he wrote the following:
http://mail.openjdk.java.net/pipermail/closures-dev/2009-December/000506.html
I thought he was looking for a solution of how the desired semantics could be implemented.
Peter
On Monday 04 January 2010 12:58:28 Zdenek Tronicek wrote:
> Did you have a look at the closures prototype? I think you describe the
> way how non-local transfer is implemented.
>
> Z.
> --
> Zdenek Tronicek
> FIT CTU in Prague
>
P.S. Analogously to the previous non-local return, labeled yield is similar but also checks the target of the yield:
@Shared #void() y1 = null;
#int() one = #One() {
if (y1 == null)
y1 = #(){ yield One: 1; };
y1();
};
System.out.println(one()); // prints "1"
System.out.println(one()); // throws exception
// With following helper class:
public class YieldInt extends RuntimeException {
public final Object initiatingLambda,
public final Object targetLambda; // null in case of return from method
public final int retval;
public YieldInt(Object initiatingLambda, Object targetLambda, int retval) {
this.initiatingLambda = initiatingLambda;
this.targetLambda = targetLambda,
this.retval = retval;
}
}
// The above could be translated into:
@Shared #void() y1 = null;
class One implements #int() {
public int invoke() {
#void() tmp$y1 = null;
try {
// #One() body begin
if (y1 == null) {
tmp$y1 = new #void()() {
public void invoke() {
throw new YieldInt(this, One.this, 1);
}
};
y1 = tmp$y1;
}
y1();
// #One() body end
}
catch (YieldInt yInt)
{
if (yInt.targetLambda == this && (yInt.initiatingLambda == tmp$y1))
return yInt.retval;
else
throw yInt;
}
}
}
#int() one = new One();
System.out.println(one()); // prints "1"
System.out.println(one()); // throws YieldInt
More information about the closures-dev
mailing list