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

Joseph Halfmoon

前回は吉例Lチカをやってみました。今回から uLisp の備える関数どもを端から一通り触っていきたいと思います。といっても御本家COMMON LISPのような膨大な関数があるわけではないです。約180個ほど。しかしその中のディスプレイ用関数群はディスプレイ接続しなければ不要。実際には百数十くらいか?

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

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

SOBJECT

uLispの内部では、sobjectという名の共用体がその骨格を作ってます。すべてはこれっす。sobjectは以下の2種類の構造体を「共用」しとります。

    • carポインタとcdrポインタからなる構造体
    • typeフィールドで格納内容が識別される共用体を含む構造体

carポインタもcdrポインタも指す先はsobjectデス。これにより何やらリストの骨格が形作られるわけであります。一方構築されたリストの「末端」では内部にシンボル名、整数、文字列、単精度浮動小数などを格納するのだと。

CAR、CDR一族

そうしてリストの所望の部分を取り出す関数は、carをとるのかcdrをとるのかハッキリしろい、ということで関数名はCARにCDRデス。朧げな記憶ではLISPの黎明のころのIBMのマシンのレジスタ名だったとか。知らんけど。uLISPの場合はCARとCDRの一族関数は全部で14個しかありませぬ。まあ百数十個のうちの14個なので大族。今回だけで約10%の関数は舐め終わりデス。

uLispの場合、14個「しかない」のは以下だからです。

    • CAR、CDR
    • 二文字のCxxR、xにはAかDが入る
    • 三文字のCxxxR、xにはAかDが入る
まずはCARとCDR

単純なCARとCDRの例が以下に。car_cdr

リスト ‘(a b c) のCARを取り出すと a であり、CDRを取り出すと ‘(b c) であります。CARの方はカッコが取れているのでSOBJECTの後の方の形式であり、CDRの方はカッコがあるので、SOBJECTの前の方の形式であることが分かります。

CAARにCADRにCDDR

とても全14個を全部舐める気にはなれないので、CxxRの「2段重ね」の中から3つほどやってお茶を濁します。まずはCAAR。CARをとってその結果のさらにCARをとるのでCAARだと。caarこんな感じ。

1回目のCARで ‘(a1 a2) を取り出せて、2回目のCARで a1 が取り出せるっと。

順序の表記はどうなってんの?というとこんな感じ。cadr_cddr

(car (cdr … ) というのが cadrと書けるわけであります。よって、cadrはb1。一方cddrは(b2)。

3段重ねのやつも以下同文です。CARとCDRだけでもできないことはないけれどその一族あればまず大抵のことはスッキリ書けるはずだと、ホントか?

Lispと一緒(4) ラズパイPico2でもuLisp、吉例Lチカ へ戻る

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