subst.cpp 921 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. /* Substitute new expr for old expr in expr.
  2. Input: push expr
  3. push old expr
  4. push new expr
  5. Output: Result on stack
  6. */
  7. #include "stdafx.h"
  8. #include "defs.h"
  9. void
  10. subst(void)
  11. {
  12. int i;
  13. save();
  14. p3 = pop(); // new expr
  15. p2 = pop(); // old expr
  16. if (p2 == symbol(NIL) || p3 == symbol(NIL)) {
  17. restore();
  18. return;
  19. }
  20. p1 = pop(); // expr
  21. if (istensor(p1)) {
  22. p4 = alloc_tensor(p1->u.tensor->nelem);
  23. p4->u.tensor->ndim = p1->u.tensor->ndim;
  24. for (i = 0; i < p1->u.tensor->ndim; i++)
  25. p4->u.tensor->dim[i] = p1->u.tensor->dim[i];
  26. for (i = 0; i < p1->u.tensor->nelem; i++) {
  27. push(p1->u.tensor->elem[i]);
  28. push(p2);
  29. push(p3);
  30. subst();
  31. p4->u.tensor->elem[i] = pop();
  32. }
  33. push(p4);
  34. } else if (equal(p1, p2))
  35. push(p3);
  36. else if (iscons(p1)) {
  37. push(car(p1));
  38. push(p2);
  39. push(p3);
  40. subst();
  41. push(cdr(p1));
  42. push(p2);
  43. push(p3);
  44. subst();
  45. cons();
  46. } else
  47. push(p1);
  48. restore();
  49. }