2 // simple
3 //
4 deff('[x,y]=t1(a,b)','x=a+b,y=a-b','n')
5 [u,v]=t1(1,2);
6 if u<> 3 then pause,end
7 if v<>-1 then pause,end
8 //
9 //with arguments
10 b=2;
11 if t1(1)<>t1(1,2) then pause,end
12 t2=t1;
13 //
14 [u,v]=t1(1,2);
15 if u<> 3 then pause,end
16 if v<>-1 then pause,end
17 b=2;
18 if t1(1)<>t1(1,2) then pause,end
19 //
20 //resume
21 //
22 deff('[x,y]=t3(a,b)','x=a+b,y=a-b,z=resume(a*a)','n')
23 [u,v]=t3(1,2);
24 if u<> 3 then pause,end
25 if v<>-1 then pause,end
26 if z<>1 then pause,end
27 b=2;
28 clear z
29 if t3(1)<>t3(1,2) then pause,end
30 if z<>1 then pause,end
31 t4=t3;
32 [u,v]=t3(1,2);
33 if u<> 3 then pause,end
34 if v<>-1 then pause,end
35 if z<>1 then pause,end
36 clear z
37 b=2;
38 if t3(1)<>t3(1,2) then pause,end
39 if z<>1 then pause,end
40 //
41 // macro + clauses
42 //
43 text = ['if n>0 then x=1'
44                                 'y=0;for k=1:n,y=y+k,end'
45                             'else x=-1'
46                                  'if n==4 then y=''yes'' '
47                                          'else y=''no'' '
48                                  'end'
49                     'end'
50                    'if n==-1 then return,end'
51                    'if n==-2 then tt=resume(n),end'
52                     'select x,'
53                     'case 1 then x=''pos'' ,tt=resume(''ok''),'
54                     'case -1 then x=''neg'' ,'
55                     'end'];
56 //
57 deff('[x,y]=t5(n)',text,'n')
58 [u,v]=t5(5);
59 if u<>'pos' then pause,end
60 if v<>15 then pause,end
61 if tt<>'ok' then pause,end
62 clear tt
63 [u,v]=t5(-1);
64 if u<>-1 then pause,end
65 if v<>'no' then pause,end
66 if exists('tt')==1 then pause,end
67 clear tt v
68 u=t5(-2);
69 if u<>-1 then pause,end
70 if tt<>-2 then pause,end
71 clear tt
72 u=t5(-4);
73 if u<>'neg' then pause,end
74 if exists('tt')==1 then pause,end
75 clear u v tt
76 [u,v]=t5(5);
77 if u<>'pos' then pause,end
78 if v<>15 then pause,end
79 if tt<>'ok' then pause,end
80 clear tt
81 [u,v]=t5(-1);
82 if u<>-1 then pause,end
83 if v<>'no' then pause,end
84 if exists('tt')==1 then pause,end
85 clear tt v
86 u=t5(-2);
87 if u<>-1 then pause,end
88 if tt<>-2 then pause,end
89 clear tt
90 u=t5(-4);
91 if u<>'neg' then pause,end
92 if exists('tt')==1 then pause,end
93 //
94 // complex clauses
95 //
96 text = ['if n>0 then x=1'
97                                 'y=0;for k=1:b(n),y=y+b(k),end'
98                             'else x=-1'
99                                  'if n==4 then y=b(''yes'') '
100                                          'else y=b(''no'') '
101                                  'end'
102                     'end'
103                    'if n==b(-1) then return,end'
104                    'if n==b(-2) then tt=resume(b(n)),end'
105                     'select x,'
106                     'case 1 then x=b(''pos'') ,tt=resume(b(''ok'')),'
107                     'case b(-1) then x=b(''neg'') ,'
108                     'end'];
109 deff('[x]=b(a)','x=a,prod([1 1])','n')
110 deff('[x,y]=t5(n)',text,'n')
111 [u,v]=t5(5);
112 if u<>'pos' then pause,end
113 if v<>15 then pause,end
114 if tt<>'ok' then pause,end
115 clear tt
116 [u,v]=t5(-1);
117 if u<>-1 then pause,end
118 if v<>'no' then pause,end
119 if exists('tt')==1 then pause,end
120 clear tt v
121 u=t5(-2);
122 if u<>-1 then pause,end
123 if tt<>-2 then pause,end
124 clear tt
125 u=t5(-4);
126 if u<>'neg' then pause,end
127 if exists('tt')==1 then pause,end
128 clear u v tt
129 [u,v]=t5(5);
130 if u<>'pos' then pause,end
131 if v<>15 then pause,end
132 if tt<>'ok' then pause,end
133 clear tt
134 [u,v]=t5(-1);
135 if u<>-1 then pause,end
136 if v<>'no' then pause,end
137 if exists('tt')==1 then pause,end
138 clear tt v
139 u=t5(-2);
140 if u<>-1 then pause,end
141 if tt<>-2 then pause,end
142 clear tt
143 u=t5(-4);
144 if u<>'neg' then pause,end
145 if exists('tt')==1 then pause,end
146 deff('[x,y]=t5(n)',text,'n')
147 [u,v]=t5(5);
148 if u<>'pos' then pause,end
149 if v<>15 then pause,end
150 if tt<>'ok' then pause,end
151 clear tt
152 [u,v]=t5(-1);
153 if u<>-1 then pause,end
154 if v<>'no' then pause,end
155 if exists('tt')==1 then pause,end
156 clear tt v
157 u=t5(-2);
158 if u<>-1 then pause,end
159 if tt<>-2 then pause,end
160 clear tt
161 u=t5(-4);
162 if u<>'neg' then pause,end
163 if exists('tt')==1 then pause,end
164 //
165 clear u v tt
166 [u,v]=t5(5);
167 if u<>'pos' then pause,end
168 if v<>15 then pause,end
169 if tt<>'ok' then pause,end
170 clear tt
171 [u,v]=t5(-1);
172 if u<>-1 then pause,end
173 if v<>'no' then pause,end
174 if exists('tt')==1 then pause,end
175 clear tt v
176 u=t5(-2);
177 if u<>-1 then pause,end
178 if tt<>-2 then pause,end
179 clear tt
180 u=t5(-4);
181 if u<>'neg' then pause,end
182 if exists('tt')==1 then pause,end
183 //more complex
184 deff('[x]=b(a)','if a==1 then x=1,else x=a,prod([1 1]),end','n')
185 //
186 deff('[x,y]=t5(n)',text,'n')
187 [u,v]=t5(5);
188 if u<>'pos' then pause,end
189 if v<>15 then pause,end
190 if tt<>'ok' then pause,end
191 clear tt
192 [u,v]=t5(-1);
193 if u<>-1 then pause,end
194 if v<>'no' then pause,end
195 if exists('tt')==1 then pause,end
196 clear tt v
197 u=t5(-2);
198 if u<>-1 then pause,end
199 if tt<>-2 then pause,end
200 clear tt
201 u=t5(-4);
202 if u<>'neg' then pause,end
203 if exists('tt')==1 then pause,end
204 clear u v tt
205 [u,v]=t5(5);
206 if u<>'pos' then pause,end
207 if v<>15 then pause,end
208 if tt<>'ok' then pause,end
209 clear tt
210 [u,v]=t5(-1);
211 if u<>-1 then pause,end
212 if v<>'no' then pause,end
213 if exists('tt')==1 then pause,end
214 clear tt v
215 u=t5(-2);
216 if u<>-1 then pause,end
217 if tt<>-2 then pause,end
218 clear tt
219 u=t5(-4);
220 if u<>'neg' then pause,end
221 if exists('tt')==1 then pause,end
222 //
223 deff('[x,y]=t5(n)',text,'n')
224 [u,v]=t5(5);
225 if u<>'pos' then pause,end
226 if v<>15 then pause,end
227 if tt<>'ok' then pause,end
228 clear tt
229 [u,v]=t5(-1);
230 if u<>-1 then pause,end
231 if v<>'no' then pause,end
232 if exists('tt')==1 then pause,end
233 clear tt v
234 u=t5(-2);
235 if u<>-1 then pause,end
236 if tt<>-2 then pause,end
237 clear tt
238 u=t5(-4);
239 if u<>'neg' then pause,end
240 if exists('tt')==1 then pause,end
241 //
242 clear u v tt
243 [u,v]=t5(5);
244 if u<>'pos' then pause,end
245 if v<>15 then pause,end
246 if tt<>'ok' then pause,end
247 clear tt
248 [u,v]=t5(-1);
249 if u<>-1 then pause,end
250 if v<>'no' then pause,end
251 if exists('tt')==1 then pause,end
252 clear tt v
253 u=t5(-2);
254 if u<>-1 then pause,end
255 if tt<>-2 then pause,end
256 clear tt
257 u=t5(-4);
258 if u<>'neg' then pause,end
259 if exists('tt')==1 then pause,end
260 // resume
261 deff('[]=t6(a)','x=resume(a)','n')
262 clear ans x
263 t6(15)
264 if x<>15 then pause,end
265 if exists('ans')==1 then pause,end
266 //
267 clear ans x
268 t6(15)
269 if x<>15 then pause,end
270 if exists('ans')==1 then pause,end
271 //
272 //
273 //
274 deff('[ydot]=simul(t,y,a)','ydot=a','n')
275 a=2;
276 //appel le plus imple
277 y=ode(0,0,1:2,simul)
278 if norm(y-[a 2*a]) >1000*%eps then pause,end
279 y=ode(0,0,1:2,simul)
280 if norm(y-[a 2*a]) >1000*%eps then pause,end
281 //appel avec passage d'arguments supplementaires
282 deff('[ydot]=simul(t,y,a)','ydot=a','n')
283 y=ode(0,0,1:2,list(simul,a))
284 if norm(y-[a 2*a]) >1000*%eps then pause,end
285 y=ode(0,0,1:2,list(simul,a))
286 if norm(y-[a 2*a]) >1000*%eps then pause,end
287 //
288 //non linear
289 //
290 text=['for k=1:n,'
291      'y=ode(a*(k-1),k-1,k,simul),'
292      'x=[x,y],'
293      'end'];
294 //
295 deff('[x]=calcul(n)',text,'n')
296 deff('[ydot]=simul(t,y,a)','ydot=a','n')
297 x=[];
298 x=calcul(3);
299 if norm(x-a*[1 2 3])>1000*%eps then pause,end
300 x=[];
301 x=calcul(3);
302 if norm(x-a*[1 2 3])>1000*%eps then pause,end
303 x=[];
304 x=calcul(3);
305 if norm(x-a*[1 2 3])>1000*%eps then pause,end
306 deff('[ydot]=simul(t,y,a)','ydot=a','n')
307 x=[];
308 x=calcul(3);
309 if norm(x-a*[1 2 3])>1000*%eps then pause,end
310 //
311 text(2)='y=ode(a*(k-1),k-1,k,list(simul,a)),';
312 deff('[x]=calcul(n)',text,'n')
313 deff('[ydot]=simul(t,y,a)','ydot=a','n')
314 x=[];
315 x=calcul(3);
316 if norm(x-a*[1 2 3])>1000*%eps then pause,end
317 x=[];
318 x=calcul(3);
319 if norm(x-a*[1 2 3])>1000*%eps then pause,end
320 x=[];
321 x=calcul(3);
322 if norm(x-a*[1 2 3])>1000*%eps then pause,end
323 deff('[ydot]=simul(t,y,a)','ydot=a','n')
324 x=[];
325 x=calcul(3);
326 if norm(x-a*[1 2 3])>1000*%eps then pause,end
327 //resume in external
328 deff('[ydot]=simul(t,y,a)','ydot=a,tt=resume([tt,t])','n')
329 tt=[]
330 deff('[x]=calcul(n)',text,'n')
331 deff('[ydot]=simul(t,y,a)','ydot=a','n')
332 x=[];
333 x=calcul(3);
334 if norm(x-a*[1 2 3])>1000*%eps then pause,end
335 x=[];
336 x=calcul(3);
337 if norm(x-a*[1 2 3])>1000*%eps then pause,end
338 x=[];
339 x=calcul(3);
340 if norm(x-a*[1 2 3])>1000*%eps then pause,end
341 deff('[ydot]=simul(t,y,a)','ydot=a','n')
342 x=[];
343 x=calcul(3);
344 if norm(x-a*[1 2 3])>1000*%eps then pause,end
345 //
346 //external calls a macro
347 //
348 deff('[x]=b(a)','if a==1 then x=a,prod([1 1]),else x=a,prod([1 1]),end','n')
349 text=['for k=1:n,'
350      'y=ode(a*(k-1),k-1,k,simul),'
351      'x=[x,y],'
352      'end'];
353 //
354 deff('[x]=calcul(n)',text,'n')
355 deff('[ydot]=simul(t,y,a)','ydot=b(a)','n')
356 x=[];
357 x=calcul(3);
358 if norm(x-a*[1 2 3])>1000*%eps then pause,end
359 x=[];
360 x=calcul(3);
361 if norm(x-a*[1 2 3])>1000*%eps then pause,end
362 x=[];
363 x=calcul(3);
364 if norm(x-a*[1 2 3])>1000*%eps then pause,end
365 deff('[ydot]=simul(t,y,a)','ydot=b(a)','n')
366 x=[];
367 x=calcul(3);
368 if norm(x-a*[1 2 3])>1000*%eps then pause,end
369 //
370 text(2)='y=ode(a*(k-1),k-1,k,list(simul,a)),';
371 deff('[x]=calcul(n)',text,'n')
372 deff('[ydot]=simul(t,y,a)','ydot=b(a)','n')
373 x=[];
374 x=calcul(3);
375 if norm(x-a*[1 2 3])>1000*%eps then pause,end
376 x=[];
377 x=calcul(3);
378 if norm(x-a*[1 2 3])>1000*%eps then pause,end
379 x=[];
380 x=calcul(3);
381 if norm(x-a*[1 2 3])>1000*%eps then pause,end
382 deff('[ydot]=simul(t,y,a)','ydot=b(a)','n')
383 x=[];
384 x=calcul(3);
385 if norm(x-a*[1 2 3])>1000*%eps then pause,end
386 //
387 deff('[ydot]=simul(t,y,a)','ydot=b(a),tt=resume([tt,t])','n')
388 tt=[]
389 deff('[x]=calcul(n)',text,'n')
390 deff('[ydot]=simul(t,y,a)','ydot=b(a)','n')
391 x=[];
392 x=calcul(3);
393 if norm(x-a*[1 2 3])>1000*%eps then pause,end
394 x=[];
395 x=calcul(3);
396 if norm(x-a*[1 2 3])>1000*%eps then pause,end
397 x=[];
398 x=calcul(3);
399 if norm(x-a*[1 2 3])>1000*%eps then pause,end
400 deff('[ydot]=simul(t,y,a)','ydot=b(a)','n')
401 x=[];
402 x=calcul(3);
403 if norm(x-a*[1 2 3])>1000*%eps then pause,end
404 text=['for k=1:n,'
405      'y=ode(a*(k-1),k-1,k,simul),'
406      'x=[x,y],'
407      'end'];
408 //
409 deff('[x]=calcul(n)',text,'n')
410 deff('[ydot]=simul(t,y,a)','ydot=b(a)','n')
411 x=[];
412 x=calcul(3);
413 if norm(x-a*[1 2 3])>1000*%eps then pause,end
414 x=[];
415 x=calcul(3);
416 if norm(x-a*[1 2 3])>1000*%eps then pause,end
417 x=[];
418 x=calcul(3);
419 if norm(x-a*[1 2 3])>1000*%eps then pause,end
420 deff('[ydot]=simul(t,y,a)','ydot=b(a)','n')
421 x=[];
422 x=calcul(3);
423 if norm(x-a*[1 2 3])>1000*%eps then pause,end
424 //
425 text(2)='y=ode(a*(k-1),k-1,k,list(simul,a)),';
426 deff('[x]=calcul(n)',text,'n')
427 deff('[ydot]=simul(t,y,a)','ydot=b(a)','n')
428 x=[];
429 x=calcul(3);
430 if norm(x-a*[1 2 3])>1000*%eps then pause,end
431 x=[];
432 x=calcul(3);
433 if norm(x-a*[1 2 3])>1000*%eps then pause,end
434 x=[];
435 x=calcul(3);
436 if norm(x-a*[1 2 3])>1000*%eps then pause,end
437 deff('[ydot]=simul(t,y,a)','ydot=b(a)','n')
438 x=[];
439 x=calcul(3);
440 if norm(x-a*[1 2 3])>1000*%eps then pause,end
441 //
442 deff('[ydot]=simul(t,y,a)','ydot=b(a),tt=resume([tt,t])','n')
443 tt=[]
444 deff('[x]=calcul(n)',text,'n')
445 deff('[ydot]=simul(t,y,a)','ydot=b(a)','n')
446 x=[];
447 x=calcul(3);
448 if norm(x-a*[1 2 3])>1000*%eps then pause,end
449 x=[];
450 x=calcul(3);
451 if norm(x-a*[1 2 3])>1000*%eps then pause,end
452 x=[];
453 x=calcul(3);
454 if norm(x-a*[1 2 3])>1000*%eps then pause,end
455 deff('[ydot]=simul(t,y,a)','ydot=b(a)','n')
456 x=[];
457 x=calcul(3);
458 if norm(x-a*[1 2 3])>1000*%eps then pause,end
459 //
460 //macro defining ,compiling and executing a macro
461 //
462 text=['deff(''[x]=b(a)'',''if a==1 then x=1,else x=a,prod([1 1]),end'',''n''),'
463       'b,'
464       'x=b(n),']
465 deff('[x]=t8(n)',text','n')
466 y=t8(10);
467 if y<>10 then pause,end
468 y=t8(10);
469 if y<>10 then pause,end
470 //
471 //
472 s=poly(0,'s');z=poly(0,'z');
473 deff('[ok]=cplist(l1,l2)',['ok=1;'
474                  'if size(l1)<>size(l2) then ok=0,return,end'
475                  'for k=1:length(l1),'
476                     'if l1(k)<>l2(k) then ok=0,return,end;'
477                  'end'],'n')
478 deff('[r]=horner(p,x)',['if type(p)==15|type(p)==16 then';
479                            'r=horner(p(2),x)./horner(p(3),x),';
480                            'return,';
481                         'end;';
482                         'd=maxi(degree(p));';
483                         'r=coeff(p,d);';
484                         'for k=1:d,';
485                           'r=r*x+coeff(p,d-k)*eye();';
486                         'end;'],'n')
487 deff('[f]=%p_r_p(p1,p2)',['[l,c]=size(p2);';
488                         'if l*c <>1 then f=p1*invr(p2),return,end;';
489                         '[l,c]=size(p1);';
490                         '[p1 p2]=simp(p1,p2*ones(l,c));';
491                         'f=tlist([''r'',''num'',''den'',''dt''],p1,p2,[]);'],'n')
495 horn=horner;
496 h=1/s;
497 if cplist(h,tlist(['r','num','den','dt'],1,s,[]))==0 then pause,end
498 h1=(z-1)/(z+1);
499 hrn=horner(h,h1);
500 if cplist(hrn , tlist(['r','num','den','dt'],z+1,z-1,[]))==0 then pause,end
501 //
502 hrn=horner(h,h1);
503 if cplist(hrn , tlist(['r','num','den','dt'],z+1,z-1,[]))==0 then pause,end
504 //
505 h=1/s;
506 if cplist(h,tlist(['r','num','den','dt'],1,s,[]))==0 then pause,end
507 h1=(z-1)/(z+1);
508 hrn=horn(h,h1);
509 if cplist(hrn , tlist(['r','num','den','dt'],z+1,z-1,[]))==0 then pause,end
510 //
511 hrn=horn(h,h1);
512 if cplist(hrn , tlist(['r','num','den','dt'],z+1,z-1,[]))==0 then pause,end
513 //
514 //
515 //
516 text=['aa=1,if a==2 then aa=b(a),end']
517 fic=file('open',TMPDIR+"/test_macro_exec",'unknown');
518 write(fic,text)
519 file('close',fic)
520 deff('[x]=b(a)','x=a,prod([1 1])','n')
521 deff('[x]=t9(a)','exec(TMPDIR+''/test_macro_exec''),x=aa','n')
522 y=t9(2)
523 if y<>2 then pause,end
524 file('rewind',fic)
525 y=t9(2)
526 if y<>2 then pause,end
527 //
528 deff('[x]=t9(a)','exec(TMPDIR+''/test_macro_exec''),x=aa','n')
529 y=t9(2)
530 if y<>2 then pause,end
531 y=t9(2)
532 if y<>2 then pause,end