Common Lispの系譜を継ぐ、マイコン上のuLispをラズパイPico2上で練習中。どうも「世界はCONSとATOMで出来ている」らしいです。今回はデータの構造体であるCONSを作り出すCONS関数と、CONSなのかATOMなのかを判断するATOM関数を練習してみます。根幹ゆえCommon Lispと当然の一致。
※Lispと一緒 投稿順 index はこちら
※実機確認は Raspberry Pi Pico2で行ってます。
※使用させていただいとります uLisp のバージョンは 4.6b (Arm用)です。
※Common Lispとの動作比較のために使わせていただいている処理系は以下です。
SBCL 2.2.2 (SBCL = Steel Bank Common Lisp )
CONSとATOM
前々回にSOBJECTなるものにちょいと触れましたが、CONSという構造体はSOBJECTを構成する共用体の「一面」です。左にCARポインタ、右にCDRポインタを持つ構造。ポインタ2つだけ。そしてATOMはSOBJECTの「もう一面」、どのようなデータなのか、整数なのか、何なのかを示した上で実データを格納。このCONSという構造を新たに1個作って返す関数がCONSです。また、オブジェクトがCONSなのかATOM(CONS以外)であるのか判定して真偽を返す関数がATOMです。
CONSの例題
さてまずはパソコン上の(Maxima様から呼び出して使っているSBCLデス)Common Lispでの動作確認。こんな感じ。
最初の例では、新たに作られたCONSセルのCAR部にはシンボルAへのポインタが入り、CDR部にはNILが入ります。なお'()はNILなので、2番目のように書いても同じ結果が得られると。3番目の例のようにCAR部にはシンボルAへのポインタを入れて、CDR部にはリスト(別なCONSセル)へのポインタを与えると、結果は連続したリストであると。一方、4番目の例のように、CAR部にシンボルAへのポインタ、CDR部にシンボルBへのポインタを入れると、「ドット」表現にて (A . B)となると。
さて上記と同じことを、ラズパイPico2のuLispにて行ってみます。
大文字、小文字の表記の違いはあるものの、結果は同じだと。当然でありますな。
ATOMの例題
CONS以外はT(真)、CONSであればNIL(偽)であると。
ラズパイPico2のuLispでも同じ結果にならないわけないのだけれども一応確認。にて行ってみます。
結果は同じ。良かった。あったりまえだが。