『実践Common Lisp』286ページの脚注8、リスト指示子についての説明(翻訳)が完全に混乱していて、全く理解できない。
HyperSpecを参照しながら、自分なりに読み解いてみた。
1.4.1.5 Designators
本書で「指示子」と訳されている designator とは、別のオブジェクトを意味する/指し示すオブジェクトである。例えば format 関数の最初のパラメータに t を与えると *terminal-io* を与えたのと同じことになるが、これは t というシンボル・オブジェクトが *terminal-io* に保持されるストリーム・オブジェクトを意味する/指し示すからだ、と言うことができる。
あるオブジェクトがどのオブジェクトを指し示すかというルールは、指示子の型によって決められている。だから指示子は普通、型名を伴って
- <<type>> designator : 〜型の指示子
- designator for a <<type>> : 〜型に対する指示子
とかいう呼び方をする(訳語は私による)。例えばシンボル t が *terminal-io* を指し示すというルールは stream desinator によって決められている。
……
『実践Common Lisp』286ページ脚注に戻ると、ecase のキーは “designator for a list of objects” と定義されている。そこでHyperSpecの用語集で list designator のところを読むと、次のようなルールが書いてある。
- nilではないアトム -> そのアトムを唯一の要素として持つリストを指し示す
- 普通のリスト -> そのリスト自身を指し示す
つまり指定できるのは「nilではないアトム」か「リスト」のどちらかで、どちらを指定したとしてもリストと見なされる。
よって ecase の動作もキーがリストであることを前提として説明される。
If the test-key is the same as any key for that clause, the forms in that clause are evaluated as an implicit progn, and the values it returns are returned as the value of the case, ccase, or ecase form.
(そもそもこの短い脚注で指定子の概念にまで言及したせいで、翻訳も混乱してしまったのではないかと思う。『ecaseのキーにはリストも指定できる。リストを指定した場合はいずれかの要素が一致する場合にマッチしたと見なされる』くらいの言い方で良かったのではなかろうか…)