Subject: Repeatedly applying trigsimp, ratsimp etc.
From: Stavros Macrakis
Date: Sun, 4 Nov 2012 17:30:59 -0500
Barton,
I agree that
for i in l do...i
is far better than
for i thru length(l) do... l[i]
After all, the latter takes quadratic time for lists (as opposed to arrays)!
As for the global 'r' problem, I agree that inpart is a reasonable
workaround for the current semantics. But this seems like a good argument
for getting rid of the current semantics, where a global array 'r' trumps a
local value 'r'.
-s
On Sun, Nov 4, 2012 at 9:27 AM, Barton Willis <willisb at unk.edu> wrote:
> (1) To access a member of a list, I suggest using inpart, not [k].
> Consider:
>
> (%i1) larry(k) := block([r : [1,2,3]], r[k])$
> (%i2) george(k) := block([r : [1,2,3]], inpart(r,k))$
>
> (%i5) r[x] : 42$
>
> Unintended:
>
> (%i6) larry(1);
> (%o6) r[1]
>
> OK:
>
> (%i7) george(1);
> (%o7) 1
>
> Alternatively,
>
> larry(k) := block([r : [1,2,3]], local(r), r[k])$
>
> is OK too.
>
> (2) To loop over the members of a list r, consider using
>
> for rk in r do ( ...
>
> instead of
>
> for k : 1 thru length(r) do ( ...
>
> The function length gets called each time at the top of the loop--also you
> will also not need to do r[k] any more :)
>
> (3) Consider giving the last argument of dssimp a goofy name such as
> %_r_%. This isn't foolproof, but it does give some protection against
> problems such as
>
> (%i5) dssimp(1,[fff]);
> (%o5) 1
>
> (%i6) dssimp(1,[r]);
> apply: found r evaluates to [r] where a function was expected.
>
> (4) To form a compound statement without local variables, an explicit
> 'block' isn't needed--just (XXX, YYY, ZZZ), not block(XXX, YYY, ZZZ).
>
>
> --Barton
>
> ________________________________________
>
>
> ----------------------
> (defmfun $conssize (x) (if (atom x) 0 (do ((x (cdr x) (cdr x)) (sz 1))
> ((null x) sz) (incf sz (1+ (conssize (car x)))))))
>
> File dssimp.mac:
> -----------------------
> dssimp(expr, r) :=
> block([exprSize, smallestExpr, smallestExprSize, simpdExpr,
> simpdExprSize],
> exprSize : conssize(expr),
> smallestExpr : expr,
> smallestExprSize : exprSize,
> loop,
> for i : 1 thru length(r) do
> block(
> simpdExpr : r[i](expr),
> simpdExprSize : conssize(simpdExpr),
> if simpdExprSize < smallestExprSize then
> block(
> smallestExpr : simpdExpr,
> smallestExprSize : simpdExprSize
> )
> ),
> if smallestExprSize >= exprSize then
> return(expr),
> expr : smallestExpr,
> exprSize : smallestExprSize,
> go(loop)
> );
>
> dssimpall(expr) := dssimp(expr, [combine, logcontract, radcan, ratsimp,
> rootscontract, trigrat, trigreduce, trigsimp, xthru]);
>
>
>
>
>
>