Lispと一緒(6) ラズパイPico2でもuLisp、EQとEQUALだけ?

Joseph Halfmoon

Common Lispの系譜を継ぐマイコン上で走るuLispをラズパイ Pico2 上で練習中。資源の限られたマイコンゆえCommon Lispと同じとはいきませぬ。前回のLispといったら CAR と CDR だろ~という浅はかな回では「3段重ね」まででした。今回EQとEQUAL見ていきます。EQLとかねえの?

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

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

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

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

SBCL 2.2.2  (SBCL =  Steel Bank Common Lisp )

比較に使うCommon Lisp処理系

Lisp素人老人は、普段使いのパソコン上でCommon Lispなど使っておりませぬ。しかし思い出しました。いつもお世話になっている定番の数式処理ソフト、Maxima様はCommon Lisp上で動いていることを。そしてMaxima様にちょいとお願いするとボロリンとCommon Lispそのものへのアクセスができるのでした。その件については以下の別件シリーズにてやってみてます。

忘却の微分方程式(167) Maxima、lisp呼び出し、コマケー話に躓くんだ、これが。

セミコロン一個にハマった話であります。とはいえ、これにて「いつもの」wxMaxima環境内でCommon Lisp(当方環境ではSBCLです。なぜにSteel Bank Common Lispと呼ばれるのか気になったらお調べくだされや。)の動作確認はできます。

EQ、EQL、EQUAL、EQUALP

前回のCAR、CDR一族ほどではないですが、何かと何かが「等しい」か否かを調べて返してくれる一族関数?その挙動によってCommon Lispでは4種類くらいあるみたいです。そいつらを動作させてみるとこんな感じ。sbcl_eqequal

eqは、実体が同じオブジェクトでないとT(真)とは判定してくれない「純な」関数なので 1 と 1 はTでしたが、'(1) などとリスト(CONSセル)に入った1同士はNILでした。一方、「心が広い」equal関数は、リストの中身が一致しておれば、セルそのものは別でも一致と判定してくれるようです。

また、EQより緩いけど、EQUALほど緩くはない、EQLという関数もあり。こいつに同じものを食わせるとNILだと。

一方、EQUALも「厳しい」判断をすることがあり。1(整数)と1.0(浮動小数)を比べた場合、値としては1なのだけれども、型が異なるのでこれはNILっす。ところがPつきの EQUALPを使えば、「値が一緒なんだからコマケー話はいいよ」とTを返してくれます。

まあ、Lispに精通した姉貴兄貴の方々はこの辺呼吸するように使い分けている筈。

Pico2ではどうよ

Pico2というか、uLisp のArm用実装 4.6bではこんな挙動です。uLisp_eqeqal

 

eqとequalは使えますが、eqlとかequalpとかは存在しないみたい。まあ、よく使う eq と equal あれば十分、コマケーところが必要だったら自分で定義しろや、ってことじゃないかと。ホントか?

Lispと一緒(5) ラズパイPico2でもuLisp、まずはCARとCDR一族 へ戻る

Lispと一緒(7) ラズパイPico2でもuLisp、世界はCONSとATOMで出来ている へ進む