执行时 Lua 中的加载函数出现问题
Problem with Load function in Lua while execution
print("i", "j", "i & j")
for i = 0,1 do
for j=0,1 do
print(i, j, i & j)
end
end
以上代码在 Lua 中运行良好。它给出以下输出。
i j i & j
0 0 0
0 1 0
1 0 0
1 1 1
但是下面的代码不起作用。基本上我想根据一些用户输入生成 Truth Table。加载功能似乎有问题。可能它与函数加载处理的变量类型有关。谁能建议?我们可以写 Lua 函数来实现吗?这是不起作用的代码。
str="i & j"
print("i", "j", "i & j")
for i = 0,1 do
for j=0,1 do
print(i,j,load(str))
end
end
使用小技巧:
local str="i * j" -- or i & j for v5.3 lua
print("i", "j", str)
for i = 0,1 do
for j=0,1 do
local s = str:gsub("i",i):gsub("j",j)
print(i,j, (loadstring or load)("return "..s)() )
end
end
这是一个尝试,最多可以使用近 60 个值:
-- Lua >= 5.3
local concat = table.concat
local str = "((i | j) ~ k) & l" -- io.read() ?
local sep = " "
local values = {} -- 0 or 1
-- i, j, k, etc.
local names = setmetatable({},
{__index = function(t,k)
t[k] = 0
values[#values+1] = k
return 0
end}
)
local aux = {} -- Values to be printed
load("return " .. str,nil,"t",names)() -- Initialization
local n = #values
print(concat(values,sep) .. sep .. str) -- Variables
for i = 0,(1<<n)-1 do -- 2^n evaluations
local k = i
for j = n,1,-1 do
names[values[j]] = k % 2
aux[j] = k % 2
k = k >> 1
end
print(concat(aux,sep) .. sep .. load("return " .. str,nil,"t",names)())
end
i j k l ((i | j) ~ k) & l
0 0 0 0 0
0 0 0 1 0
0 0 1 0 0
0 0 1 1 1
0 1 0 0 0
0 1 0 1 1
0 1 1 0 0
0 1 1 1 0
1 0 0 0 0
1 0 0 1 1
1 0 1 0 0
1 0 1 1 0
1 1 0 0 0
1 1 0 1 1
1 1 1 0 0
1 1 1 1 0
print("i", "j", "i & j")
for i = 0,1 do
for j=0,1 do
print(i, j, i & j)
end
end
以上代码在 Lua 中运行良好。它给出以下输出。
i j i & j
0 0 0
0 1 0
1 0 0
1 1 1
但是下面的代码不起作用。基本上我想根据一些用户输入生成 Truth Table。加载功能似乎有问题。可能它与函数加载处理的变量类型有关。谁能建议?我们可以写 Lua 函数来实现吗?这是不起作用的代码。
str="i & j"
print("i", "j", "i & j")
for i = 0,1 do
for j=0,1 do
print(i,j,load(str))
end
end
使用小技巧:
local str="i * j" -- or i & j for v5.3 lua
print("i", "j", str)
for i = 0,1 do
for j=0,1 do
local s = str:gsub("i",i):gsub("j",j)
print(i,j, (loadstring or load)("return "..s)() )
end
end
这是一个尝试,最多可以使用近 60 个值:
-- Lua >= 5.3
local concat = table.concat
local str = "((i | j) ~ k) & l" -- io.read() ?
local sep = " "
local values = {} -- 0 or 1
-- i, j, k, etc.
local names = setmetatable({},
{__index = function(t,k)
t[k] = 0
values[#values+1] = k
return 0
end}
)
local aux = {} -- Values to be printed
load("return " .. str,nil,"t",names)() -- Initialization
local n = #values
print(concat(values,sep) .. sep .. str) -- Variables
for i = 0,(1<<n)-1 do -- 2^n evaluations
local k = i
for j = n,1,-1 do
names[values[j]] = k % 2
aux[j] = k % 2
k = k >> 1
end
print(concat(aux,sep) .. sep .. load("return " .. str,nil,"t",names)())
end
i j k l ((i | j) ~ k) & l
0 0 0 0 0
0 0 0 1 0
0 0 1 0 0
0 0 1 1 1
0 1 0 0 0
0 1 0 1 1
0 1 1 0 0
0 1 1 1 0
1 0 0 0 0
1 0 0 1 1
1 0 1 0 0
1 0 1 1 0
1 1 0 0 0
1 1 0 1 1
1 1 1 0 0
1 1 1 1 0