Common Lispの系譜を継ぐマイコン上のuLispをラズパイPico2上で練習中。「副作用」、ピュアなLispじゃ「はしたない」操作にも思えます。しかしマイコンのハードウエアの操作は副作用の連続?胸を張って副作用を前提とした者共を練習しておきたいと思います。でもuLisp上に実装されているの意外と少ない?
※Lispと一緒 投稿順 index はこちら
※実機確認は Raspberry Pi Pico2で行ってます。
※使用させていただいとります uLisp のバージョンは 4.6b (Arm用)です。
※uLispとCommon Lispとの動作比較のために使わせていただいている処理系は以下です。
SBCL 2.2.2 (SBCL = Steel Bank Common Lisp )
今回の動作確認リスト
今回、実機上で動作確認してみるのは以下の4つです。
-
- loop
- progn
- if
- return
前回、do一族という繰り返しループを作れるマクロ(Common Lisp上ではMacro, uLispではスペシャルフォーム)をやりました。doは終了条件指定するところが明確にできるのでそれ使えばいいじゃん、それどころかループはLisp伝統の末尾再帰使えばいいじゃん、とも思うのですが、loopというスペシャルフォーム(Common Lisp、 uLispともに。珍しい意見の一致じゃよ。)が存在します。何もしなければ無限ループね。マイコンでは無限に繰り返す(例えば吉例Lチカなど)ことがフツー。ループの結果など求めませぬ。ループの中で何やら起こる「副作用」の連続こそが所望の動作なんであります。
ま、通常はloopをしつつも、いつかは終了したいので return という関数を使うことになりますな。しかし returnを呼び出す条件を記するのに、ifというスペシャルフォームを使ったりもします。
一方、ただただ副作用の連鎖を期待して、引数にとったものどもを順次呼び出すスペシャルフォームが prognであります。ただし、Common Lispではこの親戚筋は結構多いです。
-
- prog
- prog*
- plot1
- progn
- progv
plogとprog* はletとlet*相当の局所変数の初期化を行えるPROG形式っす。plog1は戻り値として2値を返せるもの。progvは大域変数を一時的にバインドしてから評価を始められるもの。なかなか豪華メンバそろってますが、uLisp上では使えませぬ。こんな感じ。
シンプルな progn があるので、それ使えという思し召しなのだと思います。
loop、if、return
ごたくを並べましたが、実行例は1撃です。まずはCommon Lisp。
ちょっと分かり易いように出力のそれぞれにどの関数が関わっているのかを色分けしてみました。クルクル回ってifで指定した条件になったら戻り値返してくると。
結果は一致。あたりまえか。
progn
ことさらに「副作用」を強調する実施例が以下に。まずはCommon Lisp。
prognの場合、末尾の者の結果を素直に返してくれることが分かります。当然、途中のxへの「副作用」も発生しとります。
副作用を期待して、順番に実行したいのならprogn使えと。ホントか?