classDef ::= 'abstract'? 'class' id 'extends' id '{' field* '}'
field ::= varDef | methodDef
methodDef ::= 'static'? type id '(' varList ')' stmtBlock
| 'abstract' type id '(' varList ')' ';'
abstract class Lambda$int$int {
abstract int apply(int arg1);
}
class Foo {
// ...
void foo() {
var x = 5; // x : int
var a = new A(); // a : class A
var func = fun (int y) {
a.doSomething();
this.anotherMethod();
return x + y;
}
}
}
class Lambda$1 extends Lambda$int$int {
int x;
class A a;
class Foo $this; // 避免命名冲突
int apply(int y) {
a.doSomething();
$this.anotherMethod();
return x + y;
}
}
var func = new Lambda$1();
func.x = x; // 拷贝作用域中存在的那个 `x` 的值
func.a = a; // 拷贝作用域中存在的那个 `a` 的引用
class Foo {
// ...
int v;
void foo() {
var x = 5; // x : int
var a = new Foo(); // a : class Foo
var func = fun (int y) {
a.v = y;
return x + y;
}
func(10);
a.v; // --> a.v == 10
}
}
class Lambda$1 extends Lambda$int$int {
int x;
class Foo a;
int apply(int y) {
a.v = y;
return x + y;
}
}
class Foo {
// ...
int v;
void foo() {
var x = 5; // x : int
var a = new Foo(); // a : class A
var func = new Lambda$1();
func.x = x;
func.a = a;
func.apply(10); // func.a.v == a.v == 10
a.v; // --> a.v == 10
}
}