1 2[ 3 Local(a,b,c,d); 4 DefMacroRuleBase(foo,{a,b}); 5 6 // Simple check 7 foo(_c,_d) <-- {@c,@d}; 8 Verify(foo(2,3),Hold({2,3})); 9 10 Macro("foo",{a}) {@a,a}; 11 a:=A; 12 Verify(foo(B),{B,A}); 13 Retract(foo,1); 14 Retract(foo,2); 15 Verify(foo(2,3),foo(2,3)); 16 Verify(foo(B),foo(B)); 17]; 18 19[ 20 Local(a,i,tot); 21 a:=100; 22 Retract(forloop,4); 23 Macro(forloop,{init,pred,inc,body}) 24 [ 25 @init; 26 While(@pred) 27 [ 28 @body; 29 @inc; 30 ]; 31 True; 32 ]; 33 tot:=0; 34 forloop(i:=1,i<=10,i++,tot:=tot+a*i); 35 Verify(i,11); 36 Verify(tot,5500); 37]; 38 39[ 40 Macro("bar",{list,...}) Length(@list); 41 Verify(bar(a,b,list,bar,list),5); 42]; 43 44[ 45 Local(x,y,z); 46 y:=x; 47 Verify(`{@x,@y},{x,x}); 48 z:=u; 49 y:={@z,@z}; 50 Verify(`{@x,@y},{x,{@z,@z}}); 51 Verify(`{@x,`(@y)},{x,{@u,@u}}); 52 y:=Hold(`{@z,@z}); 53 54 Verify(`{@x,@y},{x,{u,u}}); 55 Verify(`{@x,`(@y)},{x,{u,u}}); 56]; 57 58// check that a macro can reach a local from the calling environment. 59[ 60 Macro(foo,{x}) a*(@x); 61 Function(bar,{x}) 62 [ 63 Local(a); 64 a:=2; 65 foo(x); 66 ]; 67 Verify(bar(3),6); 68]; 69 70//check that with nested backquotes expansion only expands the top-level expression 71[ 72 Local(a,b); 73 a:=2; 74 b:=3; 75 Verify( 76 `[ 77 Local(c); 78 c:=@a+@b; 79 `((@c)*(@c)); 80 ],25); 81]; 82 83 84