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つです。
-
- mapcar
- maplist
- mapc
- mapl
- mapcan
- 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上での以下実施例をご覧くだされ。
さて、上記と同じことを uLisp 上で実行したもんが以下に。
結果は一致と。よかった。
mapc、mapl
何やら短いお名前になっている mapc と maplは、それぞれmapcarとmaplistの値の返し方が異なるもの。mapcar、maplistは関数適用結果をリストにして返してくれましたが、mapcとmaplは適用する関数の「副作用」に重きがあるようです。戻り値には関心が無いのか、元の引数をそのまま返してきます。
これまた結果は一致。
mapcan、mapcon
mapcanはmapcarと同じ派閥ですが、mapcarが関数の適用結果をリストにして返してくるのに対して、mapcanは関数がリストを返してくる前提で、関数の返り値のリストを適用結果のリストにアペンドする感じでひっつけて返してくれるもの。実施例では 同じ引数に対して mapcanとmapcarしているので御覧じろ。
次は、uLispですが、こちらでは先にmapcarやって、後からmapcanやってしまってます。順番が逆。
続いて、mapconです。mapconは関数の適用まではmaplistと同様ですが、上のmapcan同様、返り値のリストの組み立て方がmaplistと異なります。
Common Lispでのmaplistとmapconはこんな感じ。
これまた結果は一致。
map一族は健在であると。