見出し画像

Retro-gaming and so on

RE: プログラミング学習日記 2023/01/23〜

星田さんの記事に対するコメント。


 あ、もしかしてAssocsってのが連想リストの事なのか?

そうですね。
ただし、assocsが一般に「そのまま連想リストを表わすのかどうか」を疑うのは正しい。
星田さんはやっぱり勘がいい。
結論から言うと、assocsが何を現してるのか、って言うのは、その二段下に書いてある(一段下は「返り値のスペック」を書いてるんだけど、分かりづらい・笑)。

assocs : (listof pair?) = null

つまりここで、

assocは(空リストを含む)ペアのリストとする。

と定義してるわけだ。
文書で書けよ、と思わないでもない(笑)。
いずれにせよ、ここでassocと言う「引数形式」は連想リストの形式だ、って事が分かるわけ。

一度ドキュメントの読み方をキッチり勉強するべきだなぁ(今更(^_^;)

うん、でもさ。
本音を言うとリファレンスマニュアルって「ザーッと目を通して」使うモンじゃない?
だから「熟読します」ってヤツの方が少ないんだよ。
ユーザーの立場から言っても、「ドキュメントを時間かけて読む」より、今やりたい事をサーッと調べて「そこだけ分かる」方が望ましいよな。
この辺、実は「マニュアル書く側」と「マニュアル読む側」って意識が乖離してて、その辺の「食い違い」ってのはどんなマニュアルでも多かれ少なかれ生じるよね。
一体誰が、「ゲーム機買ってきて」すぐゲームプレイしたいのにそのゲーム機のマニュアルを熟読しようとするんだろ(笑)。
そうだろ?
炊飯器買ってきて、すぐ米炊きたいのに、1時間も炊飯器のマニュアル全読、ってんで格闘するだろうか。
そうなんだよな、マニュアル書くヤツってのは相当工夫して書かなきゃならない。でもマニュアル書くヤツは、「これだけ俺が苦労して書いたんだから全部読め」って言い出しかねない、なんつーの、高慢さがあるんだよな。

んでだ。
Racketのマニュアルは「悪い方のマニュアル」だと思ってる。んで、いっつも言ってるけど、全般的にはScheme系言語のマニュアルって「悪しきマニュアル」の方なんだよ。Gaucheだけがほぼ例外だと言って良いくらいだ。
ANSI Common LispのCLHSとは大違いなんだよ。CLHSは例示が豊富なんで「取り敢えずこういうカンジで記述すればこう動く」ってのが一目瞭然なんだけど、Racketにはそれがない。例示があったりなかったり、マジな話でデタラメだ。

んで、大雑把に言うとだ。
Racketの関数の解説は次のようになっている。

  • -> : 返り値の型のスペックが書いている。
  • 残りは提示された引数の型の説明。オプショナルパラメータ(必須じゃない引数)は[]内に書かれてるが、その型の説明もしてる。
ってのがフォーマットだ。
詳しく知りたい場合は、Notation for Documentationに書いてる。

んで追加情報。
元々、make-hashってのは、破壊的変更用のハッシュテーブルを生成する関数なんだけど。
「破壊的変更をしない」場合は、そのままhash(あるいはhash-eqvhash-eq)って関数を使う。これで形成されたハッシュテーブルは「データを追加/変更する事が出来ない」。
ただ、引数形式が(hash key val ...)と言うカタチで、make-hashと明らかに違うんだよな(笑)。
この関数に連想リストを与えてデータ形式を変更するには、ちと工夫が必要となる。


高階関数applyにも慣れよう。
applyはLispの実装上、evalと対になるほど重要な関数で、これもユーザーが実装出来ないインタプリタやコンパイラそのものに埋め込まれて無ければならない機能だ。
applyは最低でも2引数関数で、第一引数は関数、第二引数以降はリストを取るんだけど、端的に言うと、リストのカッコを外す機能がある。

例えばリスト'(1 2 3 4 5)ってのがあって、この総和を取りたいとする。
なんとなくこうしたくなるだろ?

 (+ '(1 2 3 4 5))

でもこれは上手く行かない。+ は引数として数値を取る、って大原則があるから、だ。
分かるでしょ?カッコが邪魔なんだよ。
こういう時に使うのがapplyだ。


applyは与えられたリストのカッコを外して、与えられた関数をそれらに適用する。
見れば分かるけど、なんてことないように見えて、実は超強力だ。色々と応用が効く関数で、言っちゃえばLispの高階関数での最終兵器だ。
存分に使いこなそう。
  • Xでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

最近の「RE: プログラミング学習日記」カテゴリーもっと見る

最近の記事
バックナンバー
人気記事