Lispと一緒(10) ラズパイPico2でもuLisp、算術演算、「細かい」違いはある

Joseph Halfmoon

Common Lispの系譜を継ぐ、マイコン上のuLispをラズパイPico2上で練習中です。前回は末尾に「p」がつく問いかけ(述語)どもでした。今回は算術演算です。普通の加減乗除ね。そんなところに何か埋まっている筈ない、と思ったらあきまへん。Common LispとuLispの微妙(微妙でもないか)な違いにまた遭遇。

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

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

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

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

SBCL 2.2.2  (SBCL =  Steel Bank Common Lisp )

加減乗までは問題なし

加減乗までは差異に遭遇しなかったのでさっと流します。まずは加算から。関数名は「+」です。Common Lisp上での実行結果が以下に。add

最初の例のように、引数は2つとは限らず、複数ずらずらと並べれば全部の和を求めてくれます。また、引数無の場合は0が返ります。勿論、整数であろうと浮動小数であろうと計算可能です。浮動小数に整数を加えると、浮動小数です。

uLispでの実行結果が以下に。uLispAdd

つづいて減算。まずはCommon Lispでの実行。sub

最初の例は2引数ですが、3引数以上あってもよいようです。第1の引数から第2以降の引数を全て減じたものが返ってきます。引数は1個だけでもよく、その場合は符号反転した結果が返ってきます。ただし、+と異なり、引数無の場合はエラーとなります。

同じもののuLispでの実行。uLispSub

つづいて掛け算。まずはCommon Lisp。mul

最初の例は指数表記の浮動小数ですが、勿論OK。乗算も3個以上の引数あれば全て乗じた結果を返してくれるみたい。加算同様、引数無の場合も許されていて結果は1だと。

同じもののuLispでの実行。uLispMul

除算はよく見てね

割り算にいたって、Common LispとuLispで相違があらわれてまいります。まずはCommon Lisp上での実行。div

第1の例は普通に整数割り算、第1の引数を第2の引数で割るもの。第2の例は引数が一つだけ。この場合「逆数」が返ってきますが、結果は「1/10」だと。分数(ratio)です。Common Lispは分数(ratio)を扱うことができるので、このまま計算していけば有理数の範囲なら正確な演算ができるっと。勿論(/ 10)は浮動小数じゃありません。また、3個以上の引数をとる場合、第1の引数を第2以降の全ての引数で割ったものが返ると。

uLisp上での実行結果が以下に。uLispDiv

2番目をごろうじろ。結果は 0.1 です。 uLispは ratio を扱えないので浮動小数になっちまいました。微妙(微妙でもないか、重大?)な差だな。

剰余(あまり)の計算でも見た目の差異はありです。まずはCommon Lisp。mod

浮動小数の「剰余」計算したらば、0.2ピタリとはならず、ぼろりんと内部表現の下の桁まで見えてしまいました。適当に丸めるように設定しておけばよかったか?

一方、uLispではこんな感じ。uLispmod

こちらは、「気をきかせて」ダラダラした内部表現が見えないように設定してくれているみたい。まあ、人が見えるところの気持ちだけれども。

インクリメント、デクリメント相当の1+と1-

わざわざ1を足したり、引いたりせずとも+1、ー1してくれる関数あり。お名前は 1+ と 1- と微妙なネーミングだけれども。まずはCommon Lisp。onePM

お次は uLisp。uLispOnePM

割り算の時だけかな、気をつけたらよいのは。ホントか?

Lispと一緒(9) ラズパイPico2でもuLisp、「ピー」と問えば真偽が返る、その2 へ戻る

コメントを残す

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