… | |
… | |
208 | #define T_SYNTAX 0x0010 |
208 | #define T_SYNTAX 0x0010 |
209 | #define T_IMMUTABLE 0x0020 |
209 | #define T_IMMUTABLE 0x0020 |
210 | #define T_ATOM 0x0040 /* only for gc */ |
210 | #define T_ATOM 0x0040 /* only for gc */ |
211 | #define T_MARK 0x0080 /* only for gc */ |
211 | #define T_MARK 0x0080 /* only for gc */ |
212 | |
212 | |
213 | static num num_add (num a, num b); |
|
|
214 | static num num_mul (num a, num b); |
213 | static num num_op (char op, num a, num b); |
215 | static num num_div (num a, num b); |
|
|
216 | static num num_intdiv (num a, num b); |
214 | static num num_intdiv (num a, num b); |
217 | static num num_sub (num a, num b); |
|
|
218 | static num num_rem (num a, num b); |
215 | static num num_rem (num a, num b); |
219 | static num num_mod (num a, num b); |
216 | static num num_mod (num a, num b); |
220 | static int num_eq (num a, num b); |
217 | static int num_eq (num a, num b); |
221 | static int num_gt (num a, num b); |
218 | static int num_gt (num a, num b); |
222 | static int num_ge (num a, num b); |
219 | static int num_ge (num a, num b); |
… | |
… | |
681 | static void assign_syntax (SCHEME_P_ const char *name); |
678 | static void assign_syntax (SCHEME_P_ const char *name); |
682 | static int syntaxnum (pointer p); |
679 | static int syntaxnum (pointer p); |
683 | static void assign_proc (SCHEME_P_ enum scheme_opcodes, const char *name); |
680 | static void assign_proc (SCHEME_P_ enum scheme_opcodes, const char *name); |
684 | |
681 | |
685 | static num |
682 | static num |
686 | num_add (num a, num b) |
683 | num_op (char op, num a, num b) |
687 | { |
684 | { |
688 | num ret; |
685 | num ret; |
689 | |
686 | |
690 | num_set_fixnum (ret, num_is_fixnum (a) && num_is_fixnum (b)); |
687 | num_set_fixnum (ret, num_is_fixnum (a) && num_is_fixnum (b)); |
691 | |
688 | |
692 | if (num_is_fixnum (ret)) |
689 | if (num_is_fixnum (ret)) |
693 | num_set_ivalue (ret, num_get_ivalue (a) + num_get_ivalue (b)); |
690 | { |
|
|
691 | IVALUE av = num_get_ivalue (a); |
|
|
692 | IVALUE bv = num_get_ivalue (b); |
|
|
693 | |
|
|
694 | switch (op) |
|
|
695 | { |
|
|
696 | case '+': av += bv; break; |
|
|
697 | case '-': av -= bv; break; |
|
|
698 | case '*': av *= bv; break; |
|
|
699 | case '/': av /= bv; break; |
|
|
700 | } |
|
|
701 | |
|
|
702 | num_set_ivalue (ret, av); |
|
|
703 | } |
694 | else |
704 | else |
695 | num_set_rvalue (ret, num_get_rvalue (a) + num_get_rvalue (b)); |
705 | { |
|
|
706 | RVALUE av = num_get_rvalue (a); |
|
|
707 | RVALUE bv = num_get_rvalue (b); |
696 | |
708 | |
697 | return ret; |
709 | switch (op) |
698 | } |
710 | { |
|
|
711 | case '+': av += bv; break; |
|
|
712 | case '-': av -= bv; break; |
|
|
713 | case '*': av *= bv; break; |
|
|
714 | case '/': av /= bv; break; |
|
|
715 | } |
699 | |
716 | |
700 | static num |
717 | num_set_rvalue (ret, av); |
701 | num_mul (num a, num b) |
718 | } |
702 | { |
|
|
703 | num ret; |
|
|
704 | |
|
|
705 | num_set_fixnum (ret, num_is_fixnum (a) && num_is_fixnum (b)); |
|
|
706 | |
|
|
707 | if (num_is_fixnum (ret)) |
|
|
708 | num_set_ivalue (ret, num_get_ivalue (a) * num_get_ivalue (b)); |
|
|
709 | else |
|
|
710 | num_set_rvalue (ret, num_get_rvalue (a) * num_get_rvalue (b)); |
|
|
711 | |
719 | |
712 | return ret; |
720 | return ret; |
713 | } |
721 | } |
714 | |
722 | |
715 | static num |
723 | static num |
… | |
… | |
721 | |
729 | |
722 | if (num_is_fixnum (ret)) |
730 | if (num_is_fixnum (ret)) |
723 | num_set_ivalue (ret, num_get_ivalue (a) / num_get_ivalue (b)); |
731 | num_set_ivalue (ret, num_get_ivalue (a) / num_get_ivalue (b)); |
724 | else |
732 | else |
725 | num_set_rvalue (ret, num_get_rvalue (a) / num_get_rvalue (b)); |
733 | num_set_rvalue (ret, num_get_rvalue (a) / num_get_rvalue (b)); |
726 | |
|
|
727 | return ret; |
|
|
728 | } |
|
|
729 | |
|
|
730 | static num |
|
|
731 | num_intdiv (num a, num b) |
|
|
732 | { |
|
|
733 | num ret; |
|
|
734 | |
|
|
735 | num_set_fixnum (ret, num_is_fixnum (a) && num_is_fixnum (b)); |
|
|
736 | |
|
|
737 | if (num_is_fixnum (ret)) |
|
|
738 | num_set_ivalue (ret, num_get_ivalue (a) / num_get_ivalue (b)); |
|
|
739 | else |
|
|
740 | num_set_rvalue (ret, num_get_rvalue (a) / num_get_rvalue (b)); |
|
|
741 | |
|
|
742 | return ret; |
|
|
743 | } |
|
|
744 | |
|
|
745 | static num |
|
|
746 | num_sub (num a, num b) |
|
|
747 | { |
|
|
748 | num ret; |
|
|
749 | |
|
|
750 | num_set_fixnum (ret, num_is_fixnum (a) && num_is_fixnum (b)); |
|
|
751 | |
|
|
752 | if (num_is_fixnum (ret)) |
|
|
753 | num_set_ivalue (ret, num_get_ivalue (a) - num_get_ivalue (b)); |
|
|
754 | else |
|
|
755 | num_set_rvalue (ret, num_get_rvalue (a) - num_get_rvalue (b)); |
|
|
756 | |
734 | |
757 | return ret; |
735 | return ret; |
758 | } |
736 | } |
759 | |
737 | |
760 | static num |
738 | static num |
… | |
… | |
4107 | |
4085 | |
4108 | case OP_ADD: /* + */ |
4086 | case OP_ADD: /* + */ |
4109 | v = num_zero; |
4087 | v = num_zero; |
4110 | |
4088 | |
4111 | for (x = SCHEME_V->args; x != NIL; x = cdr (x)) |
4089 | for (x = SCHEME_V->args; x != NIL; x = cdr (x)) |
4112 | v = num_add (v, nvalue (car (x))); |
4090 | v = num_op ('+', v, nvalue (car (x))); |
4113 | |
4091 | |
4114 | s_return (mk_number (SCHEME_A_ v)); |
4092 | s_return (mk_number (SCHEME_A_ v)); |
4115 | |
4093 | |
4116 | case OP_MUL: /* * */ |
4094 | case OP_MUL: /* * */ |
4117 | v = num_one; |
4095 | v = num_one; |
4118 | |
4096 | |
4119 | for (x = SCHEME_V->args; x != NIL; x = cdr (x)) |
4097 | for (x = SCHEME_V->args; x != NIL; x = cdr (x)) |
4120 | v = num_mul (v, nvalue (car (x))); |
4098 | v = num_op ('+', v, nvalue (car (x))); |
4121 | |
4099 | |
4122 | s_return (mk_number (SCHEME_A_ v)); |
4100 | s_return (mk_number (SCHEME_A_ v)); |
4123 | |
4101 | |
4124 | case OP_SUB: /* - */ |
4102 | case OP_SUB: /* - */ |
4125 | if (cdr (SCHEME_V->args) == NIL) |
4103 | if (cdr (SCHEME_V->args) == NIL) |
… | |
… | |
4132 | x = cdr (SCHEME_V->args); |
4110 | x = cdr (SCHEME_V->args); |
4133 | v = nvalue (car (SCHEME_V->args)); |
4111 | v = nvalue (car (SCHEME_V->args)); |
4134 | } |
4112 | } |
4135 | |
4113 | |
4136 | for (; x != NIL; x = cdr (x)) |
4114 | for (; x != NIL; x = cdr (x)) |
4137 | v = num_sub (v, nvalue (car (x))); |
4115 | v = num_op ('+', v, nvalue (car (x))); |
4138 | |
4116 | |
4139 | s_return (mk_number (SCHEME_A_ v)); |
4117 | s_return (mk_number (SCHEME_A_ v)); |
4140 | |
4118 | |
4141 | case OP_DIV: /* / */ |
4119 | case OP_DIV: /* / */ |
4142 | if (cdr (SCHEME_V->args) == NIL) |
4120 | if (cdr (SCHEME_V->args) == NIL) |
… | |
… | |
4173 | } |
4151 | } |
4174 | |
4152 | |
4175 | for (; x != NIL; x = cdr (x)) |
4153 | for (; x != NIL; x = cdr (x)) |
4176 | { |
4154 | { |
4177 | if (ivalue (car (x)) != 0) |
4155 | if (ivalue (car (x)) != 0) |
4178 | v = num_intdiv (v, nvalue (car (x))); |
4156 | v = num_op ('/', v, nvalue (car (x))); |
4179 | else |
4157 | else |
4180 | Error_0 ("quotient: division by zero"); |
4158 | Error_0 ("quotient: division by zero"); |
4181 | } |
4159 | } |
4182 | |
4160 | |
4183 | s_return (mk_number (SCHEME_A_ v)); |
4161 | s_return (mk_number (SCHEME_A_ v)); |