-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathackermann_oo_inline.grace
More file actions
executable file
·98 lines (91 loc) · 3.45 KB
/
Copy pathackermann_oo_inline.grace
File metadata and controls
executable file
·98 lines (91 loc) · 3.45 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
dialect "minispec"
import "performance" as performance
// lineNumber = 0; // to avoid reporting line number in native code
// var returnTarget = invocationCount; // will be incremented by invoked method
// var meth = obj.methods[methname];
// if (meth.confidential) { raiseConfidentialMethod(methname, obj); }
// var ret = meth.apply(obj, args);
// setLineNumber(origLineNumber);
method ackermann(m, n) {
native "js" code ‹
var opresult3 = var_m["==(1)"]([1], new GraceNum(0));
if (Grace_isTrue(opresult3)) {
setLineNumber(7); // compilenode num
var origLineNumber = lineNumber;
lineNumber = 0;
var sum4 = var_n["+(1)"]([1], new GraceNum(1));
setLineNumber(origLineNumber);
if2 = sum4;
} else {
var if5 = GraceDone;
setLineNumber(26); // compilenode num
origLineNumber = lineNumber;
lineNumber = 0;
var opresult6 = var_n["==(1)"]([1], new GraceNum(0));
setLineNumber(origLineNumber);
if (Grace_isTrue(opresult6)) {
setLineNumber(34); // compilenode num
origLineNumber = lineNumber;
lineNumber = 0;
var diff8 = var_m["-(1)"]([1], new GraceNum(1));
setLineNumber(origLineNumber);
// call case 1: outer request
origLineNumber = lineNumber;
lineNumber = 0;
var call7 = var_$module["ackermann(2)"]([2], diff8, new GraceNum(1));
setLineNumber(origLineNumber);
if5 = call7;
} else {
setLineNumber(21); // compilenode num
origLineNumber = lineNumber;
lineNumber = 0;
var diff10 = var_m["-(1)"]([1], new GraceNum(1));
setLineNumber(origLineNumber);
origLineNumber = lineNumber;
lineNumber = 0;
var diff12 = var_n["-(1)"]([1], new GraceNum(1));
setLineNumber(origLineNumber);
// call case 1: outer requestorigLineNumber = lineNumber;
lineNumber = 0;
var call11 = var_$module["ackermann(2)"]([2], var_m, diff12);
setLineNumber(origLineNumber);
// call case 1: outer request
origLineNumber = lineNumber;
lineNumber = 0;
var call9 = var_$module["ackermann(2)"]([2], diff10, call11);
setLineNumber(origLineNumber);
if5 = call9;
}
if2 = if5;
}
return if2;
›
}
native "js" code ‹
GraceNum.prototype["==(1)"] = GraceNum.prototype.methods["==(1)"];
GraceNum.prototype["+(1)"] = GraceNum.prototype.methods["+(1)"];
GraceNum.prototype["-(1)"] = GraceNum.prototype.methods["-(1)"];
GraceNum.prototype["==(1)"] = GraceNum.prototype.methods["==(1)"];
var_$module["ackermann(2)"] = var_$module.methods["ackermann(2)"];
›
describe "ackermann on small known values" with {
specify "A(1,2)" by {
expect (ackermann(1,2)) toBe 4
}
specify "A(3,2)" by {
expect (ackermann(3,2)) toBe 29
expect (ackermann(3,2)) toBe (a3(2))
}
specify "A(3,4)" by {
expect (ackermann(3,4)) toBe 125
expect (ackermann(3,4)) toBe (a3(4))
}
specify "A(4,0)" by {
expect (ackermann(4,0)) toBe 13
}
}
method a3(n) {
// computes ackermann(3, n)
(2^(n+3)) - 3
}
performance.summarize(performance.benchmark{ ackermann(3,5) })