mirror of
https://github.com/KevinMidboe/linguist.git
synced 2025-10-29 17:50:22 +00:00
samples: add Terra samples
source: https://github.com/zdevito/terra/tree/master/tests
This commit is contained in:
61
samples/Terra/lazylog.t
Normal file
61
samples/Terra/lazylog.t
Normal file
@@ -0,0 +1,61 @@
|
||||
local function gentrees(depth)
|
||||
local function treetostring(tree)
|
||||
if type(tree) == "string" then return tree
|
||||
elseif tree.rhs then return "(" .. treetostring(tree.lhs) .. " " .. tree.op .. " " .. treetostring(tree.rhs) .. ")"
|
||||
else return "(" .. tree.op .. " " .. treetostring(tree.lhs) .. ")" end
|
||||
end
|
||||
local function gendepth(depth)
|
||||
local trees = {}
|
||||
table.insert(trees, "%s")
|
||||
if depth == 0 then return trees end
|
||||
local subtrees = gendepth(depth - 1)
|
||||
for _,t0 in ipairs(subtrees) do
|
||||
table.insert(trees, { lhs = t0, op = "not" })
|
||||
for _,t1 in ipairs(subtrees) do
|
||||
table.insert(trees, { lhs = t0, rhs = t1, op = "and" })
|
||||
table.insert(trees, { lhs = t0, rhs = t1, op = "or" })
|
||||
end
|
||||
end
|
||||
return trees
|
||||
end
|
||||
local trees = gendepth(depth)
|
||||
local nargs = 2 ^ depth
|
||||
local argassign = "local i0"
|
||||
local targs = "return terra(i0 : bool"
|
||||
local args = {"i0"}
|
||||
for i = 1, nargs - 1 do
|
||||
local arg = "i"..tostring(i)
|
||||
table.insert(args,arg)
|
||||
argassign = argassign .. ", " .. arg
|
||||
targs = targs .. ", " .. arg .. " : bool"
|
||||
end
|
||||
argassign = argassign .. " = ..."
|
||||
targs = targs .. ")"
|
||||
|
||||
argassign = argassign .. "\nreturn "
|
||||
targs = targs .. "\nreturn "
|
||||
for treeno,t in ipairs(trees) do
|
||||
local line = string.format(treetostring(t),unpack(args))
|
||||
io.write(string.format("\r%3d%% %s",treeno/#trees * 100,line))
|
||||
local lcode = argassign .. line
|
||||
local tcode = targs .. line .. " end"
|
||||
local lfn = assert(loadstring(lcode))
|
||||
local tfn = assert(terralib.loadstring(tcode))()
|
||||
tfn:compile()
|
||||
local states = 2 ^ nargs
|
||||
local actuals = {}
|
||||
local band = bit.band
|
||||
local blshift = bit.lshift
|
||||
for i = 0, states - 1 do
|
||||
for s = 1, nargs do
|
||||
actuals[s] = 0 ~= band(i,blshift(1,s-1))
|
||||
end
|
||||
local result = lfn(unpack(actuals))
|
||||
local result2 = tfn(unpack(actuals))
|
||||
assert(result == result2)
|
||||
end
|
||||
end
|
||||
io.write("\n")
|
||||
end
|
||||
|
||||
gentrees(2)
|
||||
Reference in New Issue
Block a user