前回は Maxima様の縁の下に隠れているLisp(Common Lisp)を呼び出すためにMaxima様の「Program Flow関係」に踏み込んでしまいました。毒を食らわば皿まで、ということで(何が毒だ)、今回はMaxima中でループを構成する方法を練習してみます。forとかdoとか「ありがちな奴ら」が大挙登場。
※「忘却の微分方程式」投稿順 index はこちら
※ MaximaおよびそのGUIであるwxMaximaの以下バージョンを使用させていただいております。
-
- wxMaxima 22.04.0
- Maxima 5.46.0(x86_64-w64-mingw32)
- SBCL 2.2.2 (SBCL = Steel Bank Common Lisp )
Maximaの中の繰り返し
Maximaでは「特殊演算子」という分かったような分からぬような位置づけのモノどもの中にループを司るキーワードの一群がふくまれとります。
-
- for
- thru
- step
- do
- next
- while
- unless
- in
「普通の」プログラミング言語でよくお目にかかるようなキーワードもチラホラ。使い方については、以下の解説ページ(日本語)をみれば書かれてます。使い方もフツーです。が、それだけだと終わってしまうので、敢えて「簡単な」処理例を下のほうでいくつか練習してます。
繰り返し構文その1
最初は、ループの制御変数 i を2から10まで2おきに回るフツーのループです。
for i:2 thru 10 step 2 do display(i)$
まわってますなあ。いつもより多くはないか。ただし、制御変数 i は、このループにローカルな変数のようです。ループ脱出後はバインドされず、消えてしまうみたいです。ほれこのように。
よって、記憶しておくべきものは、ループに入る前に定義した「大域変数」にしまっておけということみたいです。こんな感じ。
ううむ、フツーのプログラミング言語みたいだ(そうだけれども。)
繰り返し構文その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)$
繰り返し構文その3
ループによっては制御変数など不要、ただ繰り返してくれ、というものもあるでしょう。その場合は、for すら省略可でした。
thru 5 do display("aho")$
繰り返し構文その4
さらに言えば、ループの停止条件はループの中で自主的に判断するから「無限ループ」として開始する構文もありだと。こんな感じ。
x: 1.0; do ( x: x*0.5, display(x), if x < 0.001 then return(x))$
繰り返し構文その5
多くの言語で foreach みたいなキーワードで処理される方式も可能っす。
for p in [1.1, 1.2, 1.3] do display(p)$
できたみたい。これで「プログラミング」も自在か?大丈夫か?