忘却の微分方程式(168) Maxima、for、do、next、thru他 繰り返し

Joseph Halfmoon

前回は Maxima様の縁の下に隠れているLisp(Common Lisp)を呼び出すためにMaxima様の「Program Flow関係」に踏み込んでしまいました。毒を食らわば皿まで、ということで(何が毒だ)、今回はMaxima中でループを構成する方法を練習してみます。forとかdoとか「ありがちな奴ら」が大挙登場。

※「忘却の微分方程式」投稿順 index はこちら

※   MaximaおよびそのGUIであるwxMaximaの以下バージョンを使用させていただいております。

Maximaの中の繰り返し

Maximaでは「特殊演算子」という分かったような分からぬような位置づけのモノどもの中にループを司るキーワードの一群がふくまれとります。

    1. for
    2. thru
    3. step
    4. do
    5. next
    6. while
    7. unless
    8. in

「普通の」プログラミング言語でよくお目にかかるようなキーワードもチラホラ。使い方については、以下の解説ページ(日本語)をみれば書かれてます。使い方もフツーです。が、それだけだと終わってしまうので、敢えて「簡単な」処理例を下のほうでいくつか練習してます。

37. Program Flow

繰り返し構文その1

最初は、ループの制御変数 i を2から10まで2おきに回るフツーのループです。

for i:2 thru 10 step 2 do display(i)$

上記の結果が以下に。for_do_000

まわってますなあ。いつもより多くはないか。ただし、制御変数 i は、このループにローカルな変数のようです。ループ脱出後はバインドされず、消えてしまうみたいです。ほれこのように。

for_do_001よって、記憶しておくべきものは、ループに入る前に定義した「大域変数」にしまっておけということみたいです。こんな感じ。for_do_002

ううむ、フツーのプログラミング言語みたいだ(そうだけれども。)

繰り返し構文その2

同様なループですが、上記のような thru とか step (省略可能)を使わずに while とか unless とかを使って条件をコントロールすることも可であります。

for r:1.0 next r*0.1 while r > 0.001 do display(r)$

for r:1.0 next r*0.1 unless r < 0.001 do display(r)$

上記を実施してみると、for_do_003

繰り返し構文その3

ループによっては制御変数など不要、ただ繰り返してくれ、というものもあるでしょう。その場合は、for すら省略可でした。

thru 5 do display("aho")$

上記は5回 aho とかけと(3回じゃなかったか。)for_do_004

繰り返し構文その4

さらに言えば、ループの停止条件はループの中で自主的に判断するから「無限ループ」として開始する構文もありだと。こんな感じ。

x: 1.0;
do ( x: x*0.5,
  display(x),
  if x < 0.001 then return(x))$

上記を実施するとfor_do_005

繰り返し構文その5

多くの言語で foreach みたいなキーワードで処理される方式も可能っす。

for p in [1.1, 1.2, 1.3] do display(p)$

処理例が以下に。for_do_006

できたみたい。これで「プログラミング」も自在か?大丈夫か?

忘却の微分方程式(167) Maxima、lisp呼び出し、コマケー話に躓くんだ、これが。 へ戻る

忘却の微分方程式(169) Maxima、{vect}、ベクトル解析パッケージその1 へ進む