Lispと一緒(25) ラズパイPico2でもuLisp、map一族、健在

Joseph Halfmoon

Common Lispの系譜を継ぐマイコン上のuLispをラズパイPico2上で練習中。前回はprog一族がprognのみを残してuLisp上では不在と判明。それではということで同じく大族map一族について見てみました。map一族はuLisp上でも健在。Common Lispでの動作と相違なく、バリバリ使えますぞ。

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

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

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

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

SBCL 2.2.2  (SBCL =  Steel Bank Common Lisp )

今回の動作確認リスト

今回、実機上で動作確認してみるのは以下の6つです。

    1. mapcar
    2. maplist
    3. mapc
    4. mapl
    5. mapcan
    6. mapcon

map一族は大族ですが、2大派閥に分かれるみたいです。mapcarを筆頭にするmapcar派(mapc、mapcanが派閥のメンバ?)とmaplistを筆頭にするmaplist派(mapl、mapcon)です。全て、第一引数に関数をとり、第二引数以降の適用対象に繰り返し適用していくのですが、その繰り返しのときの引数の取り出し方でmapcar流とmaplist流が分かれると。そして関数適用した後の結果の戻し方で、それぞれの流派に3種類の関数があるようです。

mapcar、maplist

mapcarは、「car」というお名前からも想像がつく通り、第二引数以降の処理対象のcarというか、各要素を左から次々に取り出して処理するものです。処理対象が ‘(1 2 3)のようなリストであれば、最初は1、次は2、最後は3って感じっす。

一方maplistは、carの反対ということでcdrをとっていくようです。最初はリスト全体で、次は1回cdrとったもの、次は2回cdrとったものという塩梅。

そしてどちらも関数の適用結果をずらずらとリストにしたものが返ってきます。

まずは Common Lisp上での以下実施例をご覧くだされ。mapcar_maplist

さて、上記と同じことを uLisp 上で実行したもんが以下に。uLisp_mapcar_maplist

結果は一致と。よかった。

mapc、mapl

何やら短いお名前になっている mapc と maplは、それぞれmapcarとmaplistの値の返し方が異なるもの。mapcar、maplistは関数適用結果をリストにして返してくれましたが、mapcとmaplは適用する関数の「副作用」に重きがあるようです。戻り値には関心が無いのか、元の引数をそのまま返してきます。

Common Lispでの実施例が以下に。mapc_mapl

以下は、同じことを uLisp上で実行したもの。uLisp_mapc_mapl

これまた結果は一致。

mapcan、mapcon

mapcanはmapcarと同じ派閥ですが、mapcarが関数の適用結果をリストにして返してくるのに対して、mapcanは関数がリストを返してくる前提で、関数の返り値のリストを適用結果のリストにアペンドする感じでひっつけて返してくれるもの。実施例では 同じ引数に対して mapcanとmapcarしているので御覧じろ。

まずはCommon Lisp。mapcan

次は、uLispですが、こちらでは先にmapcarやって、後からmapcanやってしまってます。順番が逆。uLisp_mapcan

続いて、mapconです。mapconは関数の適用まではmaplistと同様ですが、上のmapcan同様、返り値のリストの組み立て方がmaplistと異なります。

Common Lispでのmaplistとmapconはこんな感じ。mapcon

続いて uLispではどうよ。uLisp_mapcon

これまた結果は一致。

map一族は健在であると。

Lispと一緒(24) ラズパイPico2でもuLisp、「副作用」あっての者共 へ戻る

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