Lua 化合物摩尔质量计算模块

Lua module for calculating the molar mass of chemical compounds

我一直在使用(或尝试使用,我拥有的大部分模块都是从其他 Wiki 借来的,因为我对 Lua 的理解充其量是有限的)基于 Lua 的模块及其在我的 Wiki 上调用模板(即用 {{#invoke:}} 调用它们的模板)一段时间后,我有一个化合物信息框(我的 Chembox),其中包括用于化合物中存在的每种化学元素的原子数(即化合物 分子式 中使用的那些数字)和化合物的摩尔质量。我在想,因为可以根据分子式计算化合物的摩尔质量,所以可以创建一个 Lua 模块,它可以自动为我执行此操作,而无需我输入摩尔质量我自己进入这些信息框。

所以我的问题基本上是,我该怎么做?

研究

我的背景是数学,所以我觉得最直接的方法是设置两个向量 A 和 B,然后在它们之间进行点积。 A 将包含用户定义的变量,即那些提供给调用模块的模板的变量。例如,假设我们正在谈论乙醇 (C2H6O) 那么模板可能如下所示:

{{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}))

我相信这就是您要找的:)

用您自己的值填充 "AtomicWeightLookup" table。

程序末尾有一个调用 "Calculate" 函数的示例。

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}))

通过向 Wikitech-I 邮件列表 (wikitech-I@lists.sourceforge.net) 发送电子邮件,我收到了答复。 模块:摩尔质量计算器就是要有代码(round函数是为了将最终结果四舍五入到小数点后三位,因为后来我决定我也想要这个功能):

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