UNPKG

2.36 kBtext/coffeescriptView Raw
1# pretty print
2
3
4
5bake = ->
6 h = 0
7 s = 0
8 t = 0
9 x = 0
10 y = 0
11 z = 0
12
13 expanding++
14
15 save()
16
17 p1 = pop()
18
19 s = ispoly(p1, symbol(SYMBOL_S))
20 t = ispoly(p1, symbol(SYMBOL_T))
21 x = ispoly(p1, symbol(SYMBOL_X))
22 y = ispoly(p1, symbol(SYMBOL_Y))
23 z = ispoly(p1, symbol(SYMBOL_Z))
24
25 if (s == 1 && t == 0 && x == 0 && y == 0 && z == 0)
26 p2 = symbol(SYMBOL_S)
27 bake_poly()
28 else if (s == 0 && t == 1 && x == 0 && y == 0 && z == 0)
29 p2 = symbol(SYMBOL_T)
30 bake_poly()
31 else if (s == 0 && t == 0 && x == 1 && y == 0 && z == 0)
32 p2 = symbol(SYMBOL_X)
33 bake_poly()
34 else if (s == 0 && t == 0 && x == 0 && y == 1 && z == 0)
35 p2 = symbol(SYMBOL_Y)
36 bake_poly()
37 else if (s == 0 && t == 0 && x == 0 && y == 0 && z == 1)
38 p2 = symbol(SYMBOL_Z)
39 bake_poly()
40 # don't bake the contents of some constructs such as "for"
41 # because we don't want to evaluate the body of
42 # such constructs "statically", i.e. without fully running
43 # the loops.
44 else if (iscons(p1)) and car(p1) != symbol(FOR)
45 h = tos
46 push(car(p1))
47 p1 = cdr(p1)
48 while (iscons(p1))
49 push(car(p1))
50 bake()
51 p1 = cdr(p1)
52 list(tos - h)
53 else
54 push(p1)
55
56 restore()
57
58 expanding--
59
60polyform = ->
61 h = 0
62
63 save()
64
65 p2 = pop()
66 p1 = pop()
67
68 if (ispoly(p1, p2))
69 bake_poly()
70 else if (iscons(p1))
71 h = tos
72 push(car(p1))
73 p1 = cdr(p1)
74 while (iscons(p1))
75 push(car(p1))
76 push(p2)
77 polyform()
78 p1 = cdr(p1)
79 list(tos - h)
80 else
81 push(p1)
82
83 restore()
84
85bake_poly = ->
86 h = 0
87 i = 0
88 k = 0
89 n = 0
90 #U **a
91 a = tos
92 push(p1); # p(x)
93 push(p2); # x
94 k = coeff()
95 h = tos
96 for i in[(k - 1)..0] by -1
97 p1 = stack[a+i]
98 bake_poly_term(i)
99 n = tos - h
100 if (n > 1)
101 list(n)
102 push(symbol(ADD))
103 swap()
104 cons()
105 p1 = pop()
106 moveTos tos - k
107 push(p1)
108
109# p1 points to coefficient of p2 ^ k
110
111# k is an int
112bake_poly_term = (k) ->
113 h = 0
114 n = 0
115
116 if (iszero(p1))
117 return
118
119 # constant term?
120
121 if (k == 0)
122 if (car(p1) == symbol(ADD))
123 p1 = cdr(p1)
124 while (iscons(p1))
125 push(car(p1))
126 p1 = cdr(p1)
127 else
128 push(p1)
129 return
130
131 h = tos
132
133 # coefficient
134
135 if (car(p1) == symbol(MULTIPLY))
136 p1 = cdr(p1)
137 while (iscons(p1))
138 push(car(p1))
139 p1 = cdr(p1)
140 else if (!equaln(p1, 1))
141 push(p1)
142
143 # x ^ k
144
145 if (k == 1)
146 push(p2)
147 else
148 push(symbol(POWER))
149 push(p2)
150 push_integer(k)
151 list(3)
152
153 n = tos - h
154
155 if (n > 1)
156 list(n)
157 push(symbol(MULTIPLY))
158 swap()
159 cons()
160
161