6 #include "util_const.h"
7 #include "util_random.h"
12 ==mathematical function==
16 static double arg1_double (MNode* cell, MlEnv* mlenv) {
17 MNode* arg = cell->cdr ();
21 throw (uErrorWrongNumber);
22 ans = eval_double (arg->car (), mlenv);
25 throw (uErrorWrongNumber);
31 (+ NUMBER NUMBER...) -> NUMBER
36 MNode* ml_add (MNode* cell, MlEnv* mlenv) {
37 MNode* arg = cell->cdr ();
41 a1 += eval_double (arg->car (), mlenv);
44 return newMNode_num (a1);
50 (- NUMBER NUMBER) -> NUMBER
55 MNode* ml_sub (MNode* cell, MlEnv* mlenv) {
56 MNode* arg = cell->cdr ();
61 throw (uErrorWrongNumber);
63 a1 = eval_double (arg->car (), mlenv);
65 if (arg) { // (- NUM1 NUM2)
66 a2 = eval_double (arg->car (), mlenv);
69 throw (uErrorWrongNumber);
70 return newMNode_num (a1 - a2);
72 return newMNode_num (- a1);
78 (* NUMBER NUMBER...) -> NUMBER
83 MNode* ml_mult (MNode* cell, MlEnv* mlenv) {
84 MNode* arg = cell->cdr ();
88 throw (uErrorWrongNumber);
90 a1 = eval_double (arg->car (), mlenv);
93 a1 *= eval_double (arg->car (), mlenv);
96 return newMNode_num (a1);
101 (/ NUMBER NUMBER) -> NUMBER
106 MNode* ml_div (MNode* cell, MlEnv* mlenv) {
107 MNode* arg = cell->cdr ();
112 throw (uErrorWrongNumber);
114 a1 = eval_double (arg->car (), mlenv);
115 nextNodeNonNil (arg);
116 a2 = eval_double (arg->car (), mlenv);
121 return newMNode_num (a1 / a2);
126 (% NUMBER NUMBER) -> NUMBER
131 MNode* ml_mod (MNode* cell, MlEnv* mlenv) {
132 MNode* arg = cell->cdr ();
137 throw (uErrorWrongNumber);
139 a1 = eval_double (arg->car (), mlenv);
140 nextNodeNonNil (arg);
141 a2 = eval_double (arg->car (), mlenv);
146 return newMNode_num (fmod (a1, a2));
151 (ceil NUMBER) -> NUMBER
154 //#AFUNC ceil ml_ceil
156 MNode* ml_ceil (MNode* cell, MlEnv* mlenv) {
157 double v = arg1_double (cell, mlenv);
158 return newMNode_num (ceil (v));
163 (floor NUMBER) -> NUMBER
166 //#AFUNC floor ml_floor
168 MNode* ml_floor (MNode* cell, MlEnv* mlenv) {
169 double v = arg1_double (cell, mlenv);
170 return newMNode_num (floor (v));
175 (fraction NUMBER) -> NUMBER
178 //#AFUNC fraction ml_fraction
180 MNode* ml_fraction (MNode* cell, MlEnv* mlenv) {
181 double v = arg1_double (cell, mlenv);
182 return newMNode_num (v - floor (v));
190 //#AFUNC random ml_random
192 MNode* ml_random (MNode* cell, MlEnv* mlenv) {
193 MNode* arg = cell->cdr ();
196 throw (uErrorWrongNumber);
198 return newMNode_num (randDouble ());