1 | ###
|
2 | Remove terms that involve a given symbol or expression. For example...
|
3 |
|
4 | filter(x^2 + x + 1, x) => 1
|
5 |
|
6 | filter(x^2 + x + 1, x^2) => x + 1
|
7 | ###
|
8 |
|
9 |
|
10 |
|
11 | Eval_filter = ->
|
12 | p1 = cdr(p1)
|
13 | push(car(p1))
|
14 | Eval()
|
15 | p1 = cdr(p1)
|
16 | while (iscons(p1))
|
17 | push(car(p1))
|
18 | Eval()
|
19 | filter()
|
20 | p1 = cdr(p1)
|
21 |
|
22 | ###
|
23 | For example...
|
24 |
|
25 | push(F)
|
26 | push(X)
|
27 | filter()
|
28 | F = pop()
|
29 | ###
|
30 |
|
31 | filter = ->
|
32 | save()
|
33 | p2 = pop()
|
34 | p1 = pop()
|
35 | filter_main()
|
36 | restore()
|
37 |
|
38 | filter_main = ->
|
39 | if (car(p1) == symbol(ADD))
|
40 | filter_sum()
|
41 | else if (istensor(p1))
|
42 | filter_tensor()
|
43 | else if (Find(p1, p2))
|
44 | push_integer(0)
|
45 | else
|
46 | push(p1)
|
47 |
|
48 | filter_sum = ->
|
49 | push_integer(0)
|
50 | p1 = cdr(p1)
|
51 | while (iscons(p1))
|
52 | push(car(p1))
|
53 | push(p2)
|
54 | filter()
|
55 | add()
|
56 | p1 = cdr(p1)
|
57 |
|
58 | filter_tensor = ->
|
59 | i = 0
|
60 | n = 0
|
61 | n = p1.tensor.nelem
|
62 | p3 = alloc_tensor(n)
|
63 | p3.tensor.ndim = p1.tensor.ndim
|
64 | for i in [0...p1.tensor.ndim]
|
65 | p3.tensor.dim[i] = p1.tensor.dim[i]
|
66 | for i in [0...n]
|
67 | push(p1.tensor.elem[i])
|
68 | push(p2)
|
69 | filter()
|
70 | p3.tensor.elem[i] = pop()
|
71 | push(p3)
|