Lispと一緒(21) ラズパイPico2でもuLisp、マクロでない者共

Joseph Halfmoon

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として実装されているものを実機上で動作確認してみます。結論を先に言っておけば、実装はともあれ、その動作を見る限り違いは分かりませぬ。

    1. and
    2. or
    3. cond
    4. case
    5. when
    6. 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

最初の(and ~では、前の2つの条件がともに真(T)であるので、末尾の(setqが処理されて返り値は1となってます。二番目の(and ~では、最初の(>でnilになってしまうので、結果はNILで setqの評価にはたどり着きませぬ。

なお、過去回とちょっと上の見た目が変わっているのは、Maxima様を介さず直接 SBCL処理系を呼び出しているためです。

uLisp上での実行が以下に。uLisp_and

or

orは、引数に与えたあれやこれやを左から順に評価していって、結果が真(T)なら、その時点で評価を打ち切って戻ります。後は上記の以下同文ね。

まずはCommon Lisp。or

uLispはどうよ。uLisp_or

cond

condは、condの後に、(テスト 式 … 式)のような節をお好みだけつなげていき、テストが真になった節の式を全部実行し、最後の式の値を返す、というものです。Lispじゃ普通の分岐ね。Common Lispでの実行例が以下に。cond

同じもの(画面の都合で一行にしてるけど)をuLispで実行したものが以下に。uLisp_cond

case

caseは、caseの直後のキーと一致する節を見つけて、節の式を全部実行し、最後の式の値を返す、というものです。Cのswitch文みたいなやつ?case

同じもの(画面の都合で一行にしてるけど)をuLispで実行したものが以下に。

uLisp_case

 

unless

unlessは、直後の条件が成立しないときに、その後をずらずら評価するもの。Common Lisp上での実行例が以下に。unless

成立しちゃうとその後は評価されませぬ。

uLispでの実行例が以下に。uLisp_unless

when

whenはその逆、条件が成立したら、その後を評価。Common Lisp上での実行が以下に。when

uLispでの実行例が以下に。uLisp_when2

実装は異なるけど、見た目の動作はそっくり。

Lispと一緒(20) ラズパイPico2でもuLisp、Macroはどこ? へ戻る

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です