読者です 読者をやめる 読者になる 読者になる

maxima のスコープ

maxima

関数の高階の合成を作りたいと思い

compose_sub(fn,var):=fn(var);
compose(fn,n,var):=rreduce(compose_sub, makelist(fn,n), var);

としたところ

g(x):=x^2;

compose(g,3,x); 
=> x^8

compose(g,3,2);
=> 256

で一見うまくいくが

fn(x):=x^3;

と別の関数を定義すると

compose(g,3,x);
=> x^27

となってしまう.maxima は古い lisp の時代に書かれたので dynamic scope なのです.

しょうがないので変数にありえないような名前をつけるという悪しき解法に頼ることにした.

compose_sub(___function___symbol___, var):=___function___symbol___(var);
compose(___function___symbol___, n, var):=rreduce(compose_sub, makelist(___function___symbol___, n), var);

以後,プログラム中では "___function___symbol___" という名前の関数名を絶対に使わないというルールを守る必要がある.