#:g1: named-readtables不要論

Posted 2020-10-12 17:25:13 GMT

リードテーブルの切り換えにnamed-readtablesを愛用しているので不要ということもないのですが、リードテーブルの切り換えという中核の機構が外部のライブラリに依存しているのが少し嫌だったりします。
実際、named-readtablesがメンテナ不在時に壊れたままだったり、ECLのような処理系では頻繁に壊れていたりはするのですが、便利といえば便利なので愛用しています。

そもそもCommon Lispの前身であるLisp Machine Lispでは、ファイル先頭の属性リスト-*- mode: lisp -*-で、パッケージとリードテーブルを切り替えるのが基本でしたが、Common Lispではそれを採用しなかったので、(in-package ...)等を書くことになりました。

しかし、(in-package ...)は標準なのに、(in-readtable ..)等は標準でないのは何故なのか。

*readtableを切り換えるin-syntaxも提案されてはいた

実は、*readtableを切り換えるin-syntaxもKent Pitman(KMP)氏によって提案されてはいたようです。

in-syntaxはHyperSpecのイシューまとめにもありますが、cl-cleanupメーリングリストの方が一連の流れが追えるのでそちらを紹介すると、

KMPの提案は、ほぼin-packageに相当するようなシンプルなものだったようです。

(DEFMACRO IN-SYNTAX (READTABLE)
  `(EVAL-WHEN (EVAL COMPILE LOAD)
     (SETQ *READTABLE* ,READTABLE)))

使い方ですが、パッケージ定義の後で、リードテーブルの変数を定義し、それにリードテーブルを設定、

;;; -----File A-----
(DEFPACKAGE ACME ...)
(DEFVAR *ACME-SYNTAX*  (COPY-READTABLE *READTABLE*))

以降のファイルは、先頭に適宜in-packagein-syntaxを書いていくというものです。

(IN-PACKAGE ACME)
(IN-SYNTAX *ACME-SYNTAX*)

(SET-MACRO-CHARACTER #\! ...)

なるほど。

良く考えると、カスタマイズされたリードテーブルを使う頻度からして、三行のマクロを都度書けば良いだけなので、毎度書いても大した手間でもないかなという感じです。
場合によっては、named-readtablesのライブラリの依存関係を記述したり、パッケージにインポートしたりの方が手間かもしれません。

ちなみに、1980年代後半〜90年代前半あたりのCommon Lispの大き目のプロジェクトでは、

(defmacro my-module ()
  `(eval-when (:compile-toplevel :load-toplevel :execute)
     (in-package my-package)
     (setq *readtable* *my-syntax*)))

のようなものを定義して、

;;; -* mode: lisp -*- 

(my-module)

...

のようにファイルの先頭に置いておく作法も割合に目にしますが、外部ライブラリのnamed-readtablesの作法に縛られるよりも自由度が高くて管理も楽かもしれません。

名前付きリードテーブルのメリット

一応、named-readtablesのメリットというか、名前付きリードテーブルのメリットを挙げておくと、名前を付けて管理する機構になっているので、find-readtableで任意のリードテーブルを呼び出すことが可能です。
恐らく、元ネタはAllegro CLのnamed readtableだと思いますが、Allegro CLのさらに元ネタは多分、Lisp Machine Lispのsi:find-readtable-named等、リードテーブルに複数の名前を付けることができたAPI由来かなと思います。

in-syntaxは何故標準化されなかったのか

KMPはシンプルに*readtable*変数を設定するだけの提案だったようですが、名前が良くない、それをいったら、*read-base*read-default-float-format*はどうするんだ、あまり気軽に変更するとcompile-fileloadで変なことが起きがちになる、仕様のクリーンナップというよりはコンパイラ仕様で議論すべきだった、等々、議論が発散してまとまらなかったようです。

まとめ

KMPが提案してANSI CL規格に入らなかったものは結構ありますが、defsystemin-syntax等は、後世の人達が結局ライブラリとして自作することになったので、標準化されると良かったなと思うことしきりです。


HTML generated by 3bmd in LispWorks Personal Edition 7.1.2

comments powered by Disqus