Common Lispの系譜を継ぐマイコン上のuLispをラズパイPico2上で練習中。前回はCommon Lisp上「マクロ」として実装されている「あれやこれ」がuLisp上ではスペシャルフォームなどとして実装されていることを見ました。今回はマクロであったはずのあれやこれの実際の動作を拝見。みかけに違いはないのよ。
※Lispと一緒 投稿順 index はこちら
※実機確認は Raspberry Pi Pico2で行ってます。
※使用させていただいとります uLisp のバージョンは 4.6b (Arm用)です。
※uLispとCommon Lispとの動作比較のために使わせていただいている処理系は以下です。
SBCL 2.2.2 (SBCL = Steel Bank Common Lisp )
今回、動作を確認してみるマクロであったものども
以下6個のCommon Lisp上ではマクロとして実装されていたハズのものども、uLisp上では、Tail-recursive formsとSpecial formsとして実装されているものを実機上で動作確認してみます。結論を先に言っておけば、実装はともあれ、その動作を見る限り違いは分かりませぬ。
-
- and
- or
- cond
- case
- when
- unless
なお、2のor を除く5個は、uLisp上ではTail-recursive formsというカテゴリであり、orのみがSpecial formsです。みたところ、Tail-recursive formsというのは、Special formsの中に繰り返しを持つ一群の処理に対して uLisp様が冠しているタイトルみたいです。そして orのみが、普通の Special forms 扱いになっている理由は、Lisp素人のお惚け老人には分かりませんでした。なんでじゃ~。
別にタイトルだけの問題なので、呼び出せばフツーに動作します。いいんだよ、コマケーことは。
and
andは、引数に与えたあれやこれやを左から順に評価していって、結果が偽(nil)であれば、その時点で評価を打ち切って戻ります(返り値はnil。)評価結果がnilでなければ末尾にいたり、その結果を返してきます。andという名の「制御構造」ですな。そしてマクロの名のとおり、先に引数どもを評価してしまうことはありませぬ。まずはCommon Lisp上での実行例が以下に。
最初の(and ~では、前の2つの条件がともに真(T)であるので、末尾の(setqが処理されて返り値は1となってます。二番目の(and ~では、最初の(>でnilになってしまうので、結果はNILで setqの評価にはたどり着きませぬ。
なお、過去回とちょっと上の見た目が変わっているのは、Maxima様を介さず直接 SBCL処理系を呼び出しているためです。
or
orは、引数に与えたあれやこれやを左から順に評価していって、結果が真(T)なら、その時点で評価を打ち切って戻ります。後は上記の以下同文ね。
cond
condは、condの後に、(テスト 式 … 式)のような節をお好みだけつなげていき、テストが真になった節の式を全部実行し、最後の式の値を返す、というものです。Lispじゃ普通の分岐ね。Common Lispでの実行例が以下に。
同じもの(画面の都合で一行にしてるけど)をuLispで実行したものが以下に。
case
caseは、caseの直後のキーと一致する節を見つけて、節の式を全部実行し、最後の式の値を返す、というものです。Cのswitch文みたいなやつ?
同じもの(画面の都合で一行にしてるけど)をuLispで実行したものが以下に。
unless
unlessは、直後の条件が成立しないときに、その後をずらずら評価するもの。Common Lisp上での実行例が以下に。
成立しちゃうとその後は評価されませぬ。
when
whenはその逆、条件が成立したら、その後を評価。Common Lisp上での実行が以下に。
実装は異なるけど、見た目の動作はそっくり。