home *** CD-ROM | disk | FTP | other *** search
/ Meeting Pearls 3 / Meeting_Pearls_III.iso / Pearls / texmf / inputs / latex / contrib / other / fp.lha / fp / fp-eval.sty < prev    next >
Text File  |  1995-04-03  |  6KB  |  156 lines

  1. \NeedsTeXFormat{LaTeX2e}
  2. \ProvidesPackage{fp-eval}[1995/04/03]
  3.  
  4. %version information
  5. \def\FP@evalversion{0.9a}
  6. \message{%
  7.   `Fixed Point Calculator',%
  8.   \space\space\space\space%
  9.   \space\space\space\space%
  10.   Version \FP@evalversion%
  11.   \space(C) Michael Mehlich%
  12.   \space\space\space\space\space\space\space%
  13.   \space\space\space\space\space\space%
  14. }
  15.  
  16. %resolve dependencies
  17. \RequirePackage{defpattern}
  18. \RequirePackage{fp-upn}
  19.  
  20. %%%public area (macros which may be used)%%%
  21. \def\FPeval#1#2{\FP@eval{#1}{#2}} % #1 := eval(#2)
  22.  
  23. %%%private fp-area (don't use these macros)%%%
  24.  
  25. %%%%%make postfix notation from prefix/infix notation
  26.  
  27. %%%handle constants and function applications
  28.  
  29. %constants
  30. \defpattern\FP@gen@app[#2]{#2}
  31.  
  32. %function applications from prefix to postfix
  33. \defpattern\FP@gen@app[add #2]{#2 add}
  34. \defpattern\FP@gen@app[sub #2]{#2 sub}
  35. \defpattern\FP@gen@app[mul #2]{#2 mul}
  36. \defpattern\FP@gen@app[div #2]{#2 div}
  37. \defpattern\FP@gen@app[abs #2]{#2 abs}
  38. \defpattern\FP@gen@app[neg #2]{#2 neg}
  39. \defpattern\FP@gen@app[sgn #2]{#2 sgn}
  40. \defpattern\FP@gen@app[min #2]{#2 min}
  41. \defpattern\FP@gen@app[max #2]{#2 max}
  42. \defpattern\FP@gen@app[round #2]{#2 round}
  43. \defpattern\FP@gen@app[trunc #2]{#2 trunc}
  44. \defpattern\FP@gen@app[clip #2]{#2 clip}
  45. \defpattern\FP@gen@app[exp #2]{#2 exp}
  46. \defpattern\FP@gen@app[ln #2]{#2 ln}
  47. \defpattern\FP@gen@app[pow #2]{#2 pow}
  48. \defpattern\FP@gen@app[root #2]{#2 root}
  49. \defpattern\FP@gen@app[seed #2]{#2 seed}
  50. \defpattern\FP@gen@app[random #2]{#2 random}
  51. \defpattern\FP@gen@app[sin #2]{#2 sin}
  52. \defpattern\FP@gen@app[cos #2]{#2 cos}
  53. \defpattern\FP@gen@app[sincos #2]{#2 sincos}
  54. \defpattern\FP@gen@app[tan #2]{#2 tan}
  55. \defpattern\FP@gen@app[cot #2]{#2 cot}
  56. \defpattern\FP@gen@app[tancot #2]{#2 tancot}
  57. \defpattern\FP@gen@app[arcsin #2]{#2 arcsin}
  58. \defpattern\FP@gen@app[arccos #2]{#2 arccos}
  59. \defpattern\FP@gen@app[arcsincos #2]{#2 arcsincos}
  60. \defpattern\FP@gen@app[arctan #2]{#2 arctan}
  61. \defpattern\FP@gen@app[arccot #2]{#2 arccot}
  62. \defpattern\FP@gen@app[arctancot #2]{#2 arctancot}
  63. \defpattern\FP@gen@app[pop #2]{#2 pop}
  64. \defpattern\FP@gen@app[swap #2]{#2 swap}
  65. \defpattern\FP@gen@app[copy #2]{#2 copy}
  66. \defpattern\FP@gen@app[ #2]{\FP@gen@app[#2]}
  67.  
  68. \def\FP@gen@app@handle#1{\FP@gen@app[#1]}
  69.  
  70. %%%handle ^, right to left
  71. \defpattern\FP@gen@exp[#2]{\FP@gen@app@handle{#2}}
  72. \defpattern\FP@gen@exp[#2^#3]{\FP@gen@exp[#3] \FP@gen@exp[#2] pow}
  73.  
  74. \def\FP@gen@exp@handle#1{\FP@gen@exp[#1]}
  75.  
  76. %%%handle * and /, left to right
  77.  
  78. %handle two or more occurrences of * and /
  79. \defpattern\FP@gen@mul@splitted[#2|/|#3|#4|#5]{\FP@gen@mul@handle{\FP@gen@exp@handle{#2} \FP@gen@exp@handle{#3} div #4#5}}
  80. \defpattern\FP@gen@mul@splitted[#2|*|#3|#4|#5]{\FP@gen@mul@handle{\FP@gen@exp@handle{#2} \FP@gen@exp@handle{#3} mul #4#5}}
  81.  
  82. %split second * or / if exists
  83. \defpattern\FP@gen@mul@split@two@div[#2|#3|#4|#5|#6]{\FP@gen@mul@splitted[#2|#3|#4|#5|#6]}
  84. \defpattern\FP@gen@mul@split@two@div[#2|#3|#4/#5|#6|#7]{\FP@gen@mul@splitted[#2|#3|#4|/|#5#6#7]}
  85. \defpattern\FP@gen@mul@split@two[#2|/|#3]{\FP@gen@exp@handle{#2} \FP@gen@exp@handle{#3} div}
  86. \defpattern\FP@gen@mul@split@two[#2|*|#3]{\FP@gen@exp@handle{#2} \FP@gen@exp@handle{#3} mul}
  87. \defpattern\FP@gen@mul@split@two[#2|#3|#4/#5]{\FP@gen@mul@splitted[#2|#3|#4|/|#5]}
  88. \defpattern\FP@gen@mul@split@two[#2|#3|#4*#5]{\FP@gen@mul@split@two@div[#2|#3|#4|*|#5]}
  89.  
  90. %split first * or / if exists
  91. \defpattern\FP@gen@mul@split@one@div[#2|#3|#4]{\FP@gen@mul@split@two[#2|#3|#4]}
  92. \defpattern\FP@gen@mul@split@one@div[#2/#3|#4|#5]{\FP@gen@mul@split@two[#2|/|#3#4#5]}
  93. \defpattern\FP@gen@mul@split@one[#2]{\FP@gen@exp@handle{#2}}
  94. \defpattern\FP@gen@mul@split@one[#2/#3]{\FP@gen@mul@split@two[#2|/|#3]}
  95. \defpattern\FP@gen@mul@split@one[#2*#3]{\FP@gen@mul@split@one@div[#2|*|#3]}
  96.  
  97. %generate code for a series of * and /
  98. \def\FP@gen@mul@handle#1{\FP@gen@mul@split@one[#1]}
  99.  
  100. %%%handle + and -, left to right
  101.  
  102. %handle two or more occurrences of + and -
  103. \defpattern\FP@gen@add@splitted[#2|-|#3|#4|#5]{\FP@gen@add@handle{\FP@gen@mul@handle{#2} \FP@gen@mul@handle{#3} sub #4#5}}
  104. \defpattern\FP@gen@add@splitted[#2|+|#3|#4|#5]{\FP@gen@add@handle{\FP@gen@mul@handle{#2} \FP@gen@mul@handle{#3} add #4#5}}
  105.  
  106. %split second + or - if exists
  107. \defpattern\FP@gen@add@split@two@minus[#2|#3|#4|#5|#6]{\FP@gen@add@splitted[#2|#3|#4|#5|#6]}
  108. \defpattern\FP@gen@add@split@two@minus[#2|#3|#4-#5|#6|#7]{\FP@gen@add@splitted[#2|#3|#4|-|#5#6#7]}
  109. \defpattern\FP@gen@add@split@two[#2|-|#3]{\FP@gen@mul@handle{#2} \FP@gen@mul@handle{#3} sub}
  110. \defpattern\FP@gen@add@split@two[#2|+|#3]{\FP@gen@mul@handle{#2} \FP@gen@mul@handle{#3} add}
  111. \defpattern\FP@gen@add@split@two[#2|#3|#4-#5]{\FP@gen@add@splitted[#2|#3|#4|-|#5]}
  112. \defpattern\FP@gen@add@split@two[#2|#3|#4+#5]{\FP@gen@add@split@two@minus[#2|#3|#4|+|#5]}
  113.  
  114. %split first + or - if exists
  115. \defpattern\FP@gen@add@split@one@minus[#2|#3|#4]{\FP@gen@add@split@two[#2|#3|#4]}
  116. \defpattern\FP@gen@add@split@one@minus[#2-#3|#4|#5]{\FP@gen@add@split@two[#2|-|#3#4#5]}
  117. \defpattern\FP@gen@add@split@one[#2]{\FP@gen@mul@handle{#2}}
  118. \defpattern\FP@gen@add@split@one[#2-#3]{\FP@gen@add@split@two[#2|-|#3]}
  119. \defpattern\FP@gen@add@split@one[#2+#3]{\FP@gen@add@split@one@minus[#2|+|#3]}
  120.  
  121. %generate code for a series of + and -
  122. \def\FP@gen@add@handle#1{\FP@gen@add@split@one[#1]}
  123.  
  124. %%%handle , and : as argument lists for functions with surrounding ( and )
  125. \defpattern\FP@gen@komma[#2]{\FP@gen@add@handle{#2}}
  126. \defpattern\FP@gen@komma[#2,#3]{\FP@gen@komma[#2] \FP@gen@komma[#3] }
  127. \defpattern\FP@gen@komma[#2:#3]{\FP@gen@komma[#2] \FP@gen@komma[#3] }
  128.  
  129. %%%generate code for each paranthesis
  130. \def\FP@gen@code#1{\FP@gen@komma[#1]}
  131.  
  132. %%%handle paranthesis
  133. \defpattern\FP@kl@handle@one[#2|#3|#4]{\FP@kl@handle[#2 \FP@gen@code{#3}#4]}
  134. \defpattern\FP@kl@handle@one[#2|#3(#4|#5]{\FP@kl@handle@one[#2(#3|#4|#5]}
  135.  
  136. \defpattern\FP@kl@handle[#2]{\FP@gen@code{#2}}
  137. \defpattern\FP@kl@handle[#2(#3)#4]{%
  138.   \FP@kl@handle@one[#2|#3|#4]%
  139. }
  140.  
  141. \defpattern\FP@gen[#2]{\FP@kl@handle[#2]}
  142. \defpattern\FP@gen[#2(-#3]{\FP@gen[#2(0-#3]}
  143. \defpattern\FP@gen[#2(+#3]{\FP@gen[#2(#3]}
  144. \defpattern\FP@gen[#2( #3]{\FP@gen[#2(#3]}
  145.  
  146. \def\FP@mkupn#1{%
  147.   \expandafter\FP@gen\expandafter[#1]%
  148. }
  149.  
  150. %%%%%compute expression via upn
  151. \def\FP@eval#1#2{%
  152.   \FP@beginmessage{EVAL}%
  153.   \FPupn{#1}{\FP@mkupn{#2}}%
  154.   \FP@endmessage{}%
  155. }
  156.