Lispと一緒(27) ラズパイPico2でもuLisp、汎関数、funcall、apply

Joseph Halfmoon

Common Lispの系譜を継ぐマイコン上のuLispをラズパイPico2上で練習中。ここまでCommon LispとuLispの重複部分を練習。同一挙動が大多数ですが、一部差異もあり。そろそろ本題のPico2ハードの制御、uLisp独特な部分に行きたいデス。でも今回は重複部分の「とりあえずの〆」ね。汎関数とな。

※Lispと一緒 投稿順 index はこちら

※実機確認は Raspberry Pi Pico2で行ってます。

※使用させていただいとります uLisp のバージョンは 4.6b (Arm用)です。

※uLispとCommon Lispとの動作比較のために使わせていただいている処理系は以下です。

SBCL 2.2.2  (SBCL =  Steel Bank Common Lisp )

今回の動作確認リスト

実際、Common LispとuLispの重複部分というか、ANDな部分はまだまだあるのです、でもなかなか浚いきれないので、今回で中締め。今回、実機上で動作確認してみるのは以下の3つです。

    1. funcall
    2. apply

どちらも関数を引数にとる関数なので、汎関数とか高階関数とか何やら恐ろし気なお名前で呼ばれますが、それほどのもんじゃない。ホントか?それにお仲間の関数どもも練習してるし。

まずはfuncallで動作確認

funcallもapplyも関数を呼び出すための関数で、どちらも第1引数に呼び出される関数を与えます。funcallは第2引数以下をそのまま呼び出される関数に与え、applyは末尾の引数に可変長のリストを与えて、関数呼び出し時にはそのリスト要素はバラして関数に与えられるみたいっす。

まずは Common Lispで funcallしてみたところが以下に。funcall2

関数 fx は2引数の関数として defun しているので、最初のfuncallは成功してますが、2回目のfuncallはエラーになってデバッガに落ちてます。

uLispでの同じものが以下に。uLisp_funcall2

uLispのエラー表示の方が単刀直入?

関数名が変数に入っていたらどうよ

しかし、上記のようなコードでは「汎関数」たら言っているご利益をあまり感じませぬ。それには呼び出す関数を変数にいれて、いろいろ切り替えてみないと。

まずはCommon Lispでの処理例。左が+、右が*を呼び出した場合。funcallEC

確かに、変数に格納した関数名で処理が変わっとります。

一方、uLispの場合が以下に。uLisp_funcallEC

上に同じ。良かった。

Lispと一緒(26) ラズパイPico2でもuLisp、関数、変数の定義 へ戻る