mirror of
https://github.com/KevinMidboe/linguist.git
synced 2025-10-29 09:40:21 +00:00
236 lines
3.2 KiB
Perl
236 lines
3.2 KiB
Perl
|
|
IO = terralib.includec("stdio.h")
|
|
local Class = require("lib/javalike")
|
|
|
|
struct A {
|
|
a : int
|
|
}
|
|
terra A:times2() : int
|
|
return self.a*2
|
|
end
|
|
|
|
struct B {
|
|
b : int
|
|
}
|
|
Class.extends(B,A)
|
|
|
|
terra B:combine(a : int) : int
|
|
return self.b + self.a + a
|
|
end
|
|
|
|
|
|
struct C {
|
|
c : double
|
|
}
|
|
Class.extends(C,B)
|
|
|
|
terra C:combine(a : int) : int
|
|
return self.c + self.a + self.b + a
|
|
end
|
|
terra C:times2() : double
|
|
return self.a * 4
|
|
end
|
|
|
|
terra doubleAnA(a : &A)
|
|
return a:times2()
|
|
end
|
|
|
|
terra combineAB(b : &B)
|
|
return b:combine(3)
|
|
end
|
|
|
|
terra returnA(a : A)
|
|
return a
|
|
end
|
|
terra foobar1()
|
|
var c = C.alloc()
|
|
c.a,c.b,c.c = 1,2,3.5
|
|
return c:times2()
|
|
end
|
|
|
|
assert(foobar1() == 4)
|
|
|
|
terra foobar()
|
|
|
|
var a = A.alloc()
|
|
a.a = 1
|
|
var b = B.alloc()
|
|
b.a,b.b = 1,2
|
|
|
|
var c = C.alloc()
|
|
c.a,c.b,c.c = 1,2,3.5
|
|
|
|
var r = doubleAnA(a) + doubleAnA(b) + doubleAnA(c) + combineAB(b) + combineAB(c)
|
|
|
|
a:free()
|
|
b:free()
|
|
c:free()
|
|
|
|
return r
|
|
end
|
|
|
|
assert(23 == foobar())
|
|
|
|
Doubles = Class.interface { times2 = {} -> int }
|
|
|
|
Adds = Class.interface { add = int -> int }
|
|
|
|
struct D {
|
|
data : int
|
|
}
|
|
Class.implements(D,Doubles)
|
|
Class.implements(D,Adds)
|
|
|
|
|
|
terra D:times2() : int
|
|
return self.data * 2
|
|
end
|
|
|
|
terra D:add(a : int) : int
|
|
return self.data + a
|
|
end
|
|
|
|
|
|
terra aDoubles(a : &Doubles)
|
|
return a:times2()
|
|
end
|
|
|
|
terra aAdds(a : &Adds)
|
|
return a:add(3)
|
|
end
|
|
|
|
terra foobar2()
|
|
var a : D
|
|
a:init()
|
|
a.data = 3
|
|
return aDoubles(&a) + aAdds(&a)
|
|
end
|
|
|
|
assert(12 == foobar2())
|
|
|
|
|
|
local IO = terralib.includec("stdio.h")
|
|
struct Animal {
|
|
data : int
|
|
}
|
|
terra Animal:speak() : {}
|
|
IO.printf("... %d\n",self.data)
|
|
end
|
|
|
|
struct Dog {
|
|
}
|
|
Class.extends(Dog,Animal)
|
|
terra Dog:speak() : {}
|
|
IO.printf("woof! %d\n",self.data)
|
|
end
|
|
|
|
struct Cat {
|
|
}
|
|
|
|
Class.extends(Cat,Animal)
|
|
|
|
terra Cat:speak() : {}
|
|
IO.printf("meow! %d\n",self.data)
|
|
end
|
|
|
|
terra dospeak(a : &Animal)
|
|
a:speak()
|
|
end
|
|
|
|
terra barnyard()
|
|
var c : Cat
|
|
var d : Dog
|
|
c:init()
|
|
d:init()
|
|
c.data,d.data = 0,1
|
|
|
|
dospeak(&c)
|
|
dospeak(&d)
|
|
end
|
|
barnyard()
|
|
|
|
|
|
local Add = Class.interface { add = int -> int }
|
|
|
|
local Sub = Class.interface { sub = int -> int }
|
|
|
|
local struct P {
|
|
data : int
|
|
}
|
|
Class.implements(P,Add)
|
|
|
|
local struct C {
|
|
data2 : int
|
|
}
|
|
Class.extends(C,P)
|
|
Class.implements(C,Sub)
|
|
|
|
terra P:add(b : int) : int
|
|
self.data = self.data + b
|
|
return self.data
|
|
end
|
|
|
|
terra C:sub(b : int) : int
|
|
return self.data2 - b
|
|
end
|
|
|
|
terra doadd(a : &Add)
|
|
return a:add(1)
|
|
end
|
|
|
|
terra dopstuff(p : &P)
|
|
return p:add(2) + doadd(p)
|
|
end
|
|
|
|
terra dosubstuff(s : &Sub)
|
|
return s:sub(1)
|
|
end
|
|
|
|
terra dotests()
|
|
var p : P
|
|
p:init()
|
|
var c : C
|
|
c:init()
|
|
p.data = 1
|
|
c.data = 1
|
|
c.data2 = 2
|
|
return dopstuff(&p) + dopstuff(&c) + dosubstuff(&c)
|
|
end
|
|
|
|
assert(dotests() == 15)
|
|
|
|
terra timeadd(a :&P, N : int)
|
|
IO.printf("%p\n",a)
|
|
for i = 0, N,10 do
|
|
a:add(1)
|
|
a:add(1)
|
|
a:add(1)
|
|
a:add(1)
|
|
a:add(1)
|
|
a:add(1)
|
|
a:add(1)
|
|
a:add(1)
|
|
a:add(1)
|
|
a:add(1)
|
|
end
|
|
return a
|
|
end
|
|
|
|
local a = global(C)
|
|
|
|
terra doinit() : &P
|
|
a:init()
|
|
a.data = 0
|
|
return &a
|
|
end
|
|
|
|
local v = doinit()
|
|
timeadd:compile()
|
|
|
|
local b = terralib.currenttimeinseconds()
|
|
--timeadd(v,100000000)
|
|
local e = terralib.currenttimeinseconds()
|
|
print(e - b)
|
|
print(v.data)
|
|
|