58 lines
2.3 KiB
Plaintext
58 lines
2.3 KiB
Plaintext
library;
|
|
import self as self;
|
|
import "dart:core" as core;
|
|
import "dart:mock" as mock;
|
|
|
|
class Closure#main#function extends core::Object implements core::Function {
|
|
field core::String note = "This is temporary. The VM doesn't need closure classes.";
|
|
field mock::Context context;
|
|
constructor •(final mock::Context context) → dynamic
|
|
: self::Closure#main#function::context = context
|
|
;
|
|
method call() → dynamic {
|
|
"This is a temporary solution. In the VM, this will become an additional parameter.";
|
|
final mock::Context #contextParameter = this.{self::Closure#main#function::context};
|
|
return let final dynamic #t1 = #contextParameter.parent in let final dynamic #t2 = 0 in let final dynamic #t3 = #contextParameter.[](0) in let final dynamic #t4 = #t1.[]=(#t2, #t3) in #t3;
|
|
}
|
|
}
|
|
class Closure#main#function#1 extends core::Object implements core::Function {
|
|
field core::String note = "This is temporary. The VM doesn't need closure classes.";
|
|
field mock::Context context;
|
|
constructor •(final mock::Context context) → dynamic
|
|
: self::Closure#main#function#1::context = context
|
|
;
|
|
method call() → dynamic {
|
|
"This is a temporary solution. In the VM, this will become an additional parameter.";
|
|
final mock::Context #contextParameter = this.{self::Closure#main#function#1::context};
|
|
if(!#contextParameter.parent.[](0).==(self::max.-(1)))
|
|
throw "last: ${#contextParameter.parent.[](0)} != ${self::max.-(1)}";
|
|
}
|
|
}
|
|
static const field core::int max = 100;
|
|
static method main() → dynamic {
|
|
dynamic closures = <dynamic>[];
|
|
dynamic closures2 = <dynamic>[];
|
|
final mock::Context #context = new mock::Context::•(1);
|
|
#context.[]=(0, null);
|
|
{
|
|
mock::Context #context = new mock::Context::•(1);
|
|
#context.parent = #context;
|
|
#context.[]=(0, 0);
|
|
for (; #context.[](0).<(self::max); #context = #context.copy(), #context.[]=(0, #context.[](0).+(1))) {
|
|
closures.add(new self::Closure#main#function::•(#context));
|
|
closures2.add(new self::Closure#main#function#1::•(#context));
|
|
}
|
|
}
|
|
core::int sum = 0;
|
|
for (core::Function f in closures) {
|
|
sum = sum.+(f.call());
|
|
}
|
|
for (core::Function f in closures2) {
|
|
f.call();
|
|
}
|
|
core::int expectedSum = self::max.-(1).*(self::max).~/(2);
|
|
if(!expectedSum.==(sum)) {
|
|
throw core::Exception::•("Unexpected sum = ${sum} != ${expectedSum}");
|
|
}
|
|
}
|