Chemical calculator: Difference between revisions

no edit summary
m (Automated syntax highlighting fixup (second round - minor fixes))
No edit summary
Line 1,122:
assert 386.664, molar_mass('C27H46O') # Cholesterol
assert 315, molar_mass('Uue')</syntaxhighlight>
=={{header|Common Lisp}}==
 
''Draft''
 
==== Program ====
 
<syntaxhighlight lang="lisp">;; 22.11.20 Draft
 
(defun molar-mass (formula)
(loop for token = (find-if (lambda (x)
(equal (search (first x) formula) 0))
+tokens+)
for name = (first token)
for type = (second token)
for data = (third token)
for shift = 1
with stack = (list 0)
with memory = 0
with ratio = 0
while (plusp (length formula))
do (cond ((equal type 'A)
(rplaca stack (+ (first stack) data))
(setf memory data))
((and (equal type 'D) (plusp memory))
(multiple-value-setq (ratio shift)
(parse-integer formula :junk-allowed t))
(rplaca stack (+ (first stack) (* memory (- ratio 1))))
(setf memory 0))
((equal type 'L)
(push 0 stack)
(setf memory 0))
((and (equal type 'R) (> (length stack) 1))
(setf memory (pop stack))
(rplaca stack (+ (first stack) memory)))
(t (return)))
(setf formula (subseq formula (+ (length name) (- shift 1))))
finally (when (equal (length stack) 1)
(return (first stack)))))</syntaxhighlight>
 
==== Table ====
 
<syntaxhighlight lang="lisp">(defconstant +tokens+ '(("Ac" A 227.000) ("Ag" A 107.868) ("Al" A 026.982)
("Am" A 243.000) ("Ar" A 039.948) ("As" A 074.922)
("At" A 210.000) ("Au" A 196.967) ("Ba" A 137.327)
("Be" A 009.012) ("Bi" A 208.980) ("Bk" A 247.000)
("Br" A 079.904) ("B" A 010.810) ("Ca" A 040.078)
("Cd" A 112.414) ("Ce" A 140.116) ("Cf" A 251.000)
("Cl" A 035.450) ("Cm" A 247.000) ("Co" A 058.933)
("Cr" A 051.996) ("Cs" A 132.905) ("Cu" A 063.546)
("C" A 012.011) ("Dy" A 162.500) ("Er" A 167.259)
("Es" A 252.000) ("Eu" A 151.964) ("Fe" A 055.845)
("Fm" A 257.000) ("Fr" A 223.000) ("F" A 018.998)
("Ga" A 069.723) ("Gd" A 157.250) ("Ge" A 072.630)
("He" A 004.003) ("Hf" A 178.490) ("Hg" A 200.592)
("Ho" A 164.930) ("H" A 001.008) ("In" A 114.818)
("Ir" A 192.217) ("I" A 126.904) ("Kr" A 083.798)
("K" A 039.098) ("La" A 138.905) ("Li" A 006.940)
("Lu" A 174.967) ("Mg" A 024.305) ("Mn" A 054.938)
("Mo" A 095.950) ("Na" A 022.990) ("Nb" A 092.906)
("Nd" A 144.242) ("Ne" A 020.180) ("Ni" A 058.693)
("Np" A 237.000) ("N" A 014.007) ("Os" A 190.230)
("O" A 015.999) ("Pa" A 231.036) ("Pb" A 207.200)
("Pd" A 106.420) ("Pm" A 145.000) ("Po" A 209.000)
("Pr" A 140.908) ("Pt" A 195.084) ("Pu" A 244.000)
("P" A 030.974) ("Ra" A 226.000) ("Rb" A 085.468)
("Re" A 186.207) ("Rh" A 102.905) ("Rn" A 222.000)
("Ru" A 101.070) ("Sb" A 121.760) ("Sc" A 044.956)
("Se" A 078.971) ("Si" A 028.085) ("Sm" A 150.360)
("Sn" A 118.710) ("Sr" A 087.620) ("S" A 032.060)
("Ta" A 180.948) ("Tb" A 158.925) ("Te" A 127.600)
("Th" A 232.038) ("Ti" A 047.867) ("Tl" A 204.380)
("Tm" A 168.934) ("Ubn" A 299.000) ("Uue" A 315.000)
("U" A 238.029) ("V" A 050.941) ("W" A 183.840)
("Xe" A 131.293) ("Yb" A 173.054) ("Y" A 088.906)
("Zn" A 065.380) ("Zr" A 091.224)
("1" D 1) ("2" D 2) ("3" D 3) ("4" D 4) ("5" D 5)
("6" D 6) ("7" D 7) ("8" D 8) ("9" D 9) ("(" L 0)
(")" R 0)))</syntaxhighlight>
 
==== Tests ====
 
<pre>(and (equal (molar-mass "H") 1.008)
(equal (molar-mass "H2") 2.016)
(equal (molar-mass "H2") 2.016)
(equal (molar-mass "H2O") 18.015)
(equal (molar-mass "H2O2") 34.14)
(equal (molar-mass "(HO)2") 34.14)
(equal (molar-mass "Na2SO4") 142.036)
(equal (molar-mass "C6H12") 84.162)
(equal (molar-mass "COOH(C(CH3)2)3CH3") 186.295)
(equal (molar-mass "C6H4O2(OH)4") 176.124)
(equal (molar-mass "C27H46O") 386.664)
(equal (molar-mass "Uue") 315))</pre>
 
{{out}}
<pre>T</pre>
 
==== Step by step ====
 
<pre>COOH(C(CH3)2)3CH3
 
token: stack: memory: Step:
nil [0] 0 .
C [''12''] 12 C
O [28] 16 CO
O [44] 16 COO
H [45] 1 COOH
( [0 45] 0 .
C [12 45] 12 C
( [0 12 45] 0 .
C [12 12 45] 12 C
H [13 12 45] 1 CH
3 [15 12 45] 0 CH3
) [27 45] 15 C(CH3)
2 [42 45] 0 C(CH3)2
) [87] 42 COOH(C(CH3)2)
3 [171] 0 COOH(C(CH3)2)3
C [183] 12 COOH(C(CH3)2)3C
H [184] 1 COOH(C(CH3)2)3CH
3 [186] 0 COOH(C(CH3)2)3CH3<pre>
 
That's all Folks !
 
''cyril nocton (cyril.nocton@gmail.com) w/ google translate ¯\_(ツ)_/¯''
=={{header|D}}==
{{trans|Go}}
422

edits