我一直在使用(或尝试使用我从其他Wiki中借用的大多数模块,因为我对Lua的理解最多是有限的)基于Lua的模块及其调用模板(即调用它们的模板)我的Wiki上有{{#invoke:}}
)一段时间,我有化学化合物的信息框(我的 Chembox ),其中包含化合物中每种化学元素原子数的输入(即,化合物的分子式中使用的那些数字和化合物的摩尔质量。我在想,因为有可能根据其分子式计算化合物的摩尔质量,有可能创建一个Lua模块,可以自动为我做这个,消除了我自己输入摩尔质量的需要。这些信息框。
所以我的问题基本上是,我该怎么做?
我的背景是数学,所以我觉得最直接的方法是设置两个向量A和B,并在它们之间执行点积。 A将包含用户定义的变量,即提供给调用模块的模板的变量。例如,假设我们谈论的是乙醇(C 2 H 6 O),那么模板可能看起来像:
{{Molar mass calculator
|C = 2
|H = 6
|O = 1
}}
。 B将包含每克元素的平均原子质量,单位为克/摩尔(g / mol)。这个载体将是自己提供的(也就是说,我有一个84个元素的列表,这些元素在自然界中找到了足够数量的这些标准原子量可用,它们的标准原子量也被列出。所以我将在Lua代码,如果您只是告诉我将它们添加到代码中的位置。)。
我在Lua中查找了点产品,看看这是否可行以及如何操作并找到此代码(http://rosettacode.org/wiki/Dot_product#Lua):
function dotprod(a, b)
local ret = 0
for i = 1, #a do
ret = ret + a[i] * b[i]
end
return ret
end
print(dotprod({1, 3, -5}, {4, -2, 1}))
答案 0 :(得分:1)
我相信这就是你要找的东西:)
填充" AtomicWeightLookup"表格与您自己的价值观。
有一个示例调用"计算"程序结束时的功能。
local AtomicWeightLookup = {
C = 12.01,
H = 1.001,
O = 16
}
local function Calculate(Input)
-- Input Example: {C = 2, H = 6, O = 1}
local Result = 0
-- Iterate through Input table
for Element,Quantity in next,Input do
-- If element is not found in table, assume 0 weight.
local AtomicWeight = AtomicWeightLookup[Element] or 0
-- Multiply
Result = Result + Quantity * AtomicWeight
end
return Result
end
-- EXAMPLE
print(Calculate({C = 2, H = 6, O = 1}))
答案 1 :(得分:0)
通过电子邮件发送Wikitech-I邮件列表(wikitech-I@lists.sourceforge.net),我收到了答复。 模块:摩尔质量计算器是要有代码(圆函数用于将最终结果四舍五入到最接近的三位小数,因为我后来决定我也想要这个功能):
local p = {};
function p.calc(frame)
local atomicWeights = mw.loadData( 'Module:Standard atomic weight' )
local total = 0
for element, quantity in pairs( frame:getParent().args ) do
if quantity ~= "" then
local atomicWeight = atomicWeights[element] or error( 'Element "' .. element .. '" is not known. Please add it to [[Module:Standard atomic weight]] if it\'s not a typo.' )
quantity = tonumber( quantity ) or error( 'Quantity for ' .. element .. ' is not a number.' )
total = total + atomicWeight * quantity
end
end
function round(num, idp)
local mult = 10^(idp or 0)
return math.floor(num * mult + 0.5) / mult
end
return round(total,3)
end
return p
模块:标准原子量的代码为:
local M = {}
M['Ag'] = 107.8682 -- Silver (Ag)
M['As'] = 74.921595 -- Arsenic (As)
M['Au'] = 196.966569 -- Gold (Au)
M['B'] = 10.8135 -- Boron (B)
M['Ba'] = 137.327 -- Barium (Ba)
M['Bi'] = 208.9804 -- Bismuth (Bi)
M['Br'] = 79.904 -- Bromine (Br)
M['C'] = 12.0106 -- Carbon (C)
M['Ca'] = 40.078 -- Calcium (Ca)
M['Cl'] = 35.4515 -- Chlorine (Cl)
M['Co'] = 58.933194 -- Cobalt (Co)
M['Cu'] = 63.546 -- Copper (Cu)
M['F'] = 18.998403163 -- Fluorine (F)
M['Fe'] = 55.845 -- Iron (Fe)
M['Ga'] = 69.723 -- Gallium (Ga)
M['H'] = 1.007975 -- Hydrogen (H)
M['Hg'] = 200.592 -- Mercury (Hg)
M['I'] = 126.90447 -- Iodine (I)
M['K'] = 39.0983 -- Potassium (K)
M['Li'] = 6.9675 -- Lithium (Li)
M['Mg'] = 24.3055 -- Magnesium (Mg)
M['Mn'] = 54.938044 -- Manganese (Mn)
M['N'] = 14.006855 -- Nitrogen (N)
M['Na'] = 22.98976928 -- Sodium (Na)
M['Ni'] = 58.6934 -- Nickel (Ni)
M['O'] = 15.9994 -- Oxygen (O)
M['P'] = 30.973761998 -- Phosphorus (P)
M['Pb'] = 207.2 -- Lead (Pb)
M['Pt'] = 195.084 -- Platinum (Pt)
M['S'] = 32.0675 -- Sulfur (S)
M['Se'] = 78.971 -- Selenium (Se)
M['Sr'] = 87.62 -- Strontium (Sr)
M['Tl'] = 204.3835 -- Thallium (Tl)
M['Zn'] = 65.38 -- Zinc (Zn)
return M
和模板:摩尔质量计算器:
{{#invoke:Molar mass calculator|calc}} g/mol