#:g1: Symbolics Common Lispのread-char のrecursive-p

Posted 2014-12-29 05:36:42 GMT

read-charには、readと同じく、recursive-pのオプションがありますが、そもそもread-charが再帰的に呼ばれたことを区別する必要もない訳でCommon Lispの謎の一つです。
大抵の処理系はrecursive-pを無視していますが、LMIに至っては、仕様のバグとコメントにあったりする程。

 このrecursive-pが意味を成すとすれば、recursive-pの状態に合せて出すエラーメッセージを変えるのが精々かなと思っていましたが、そんな実装している処理系も見たことがありませんでした。

 そういう訳で新しい処理系を触ると

(With-Input-From-String (in "")
  (Read-Char in T :eof T))

(With-Input-From-String (in "") (Read-Char in T :eof nil))

の動作を確認するのが儀式となっていましたが、遂にこの二者の動作が違う処理系に出会うことができました。
さすがSymbolicsというところでしょうか。
違うといっても、どちらもEND-OF-FILEではありますが、メッセージが違います。
こっちが、recursive-pがnilの場合で、

Error: READ-CHAR encounted an EOF

となっていて、EOFに遭遇したというもの。

read-char-norec

そして、こっちが、recursive-pがTの場合

Error: EOF detected by READ-CHAR in the middle of expression

というエラーメッセージになっていて、何かの式を読み取る途中で(つまり再帰的に呼ばれていて)EOFに遭遇した、というものになっています。

read-char-rec

これは、READ-CHARの設計者も満足な実装ではないでしょうか。


HTML generated by 3bmd in SBCL 1.2.9

comments powered by Disqus