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に遭遇したというもの。
そして、こっちが、recursive-pがTの場合
Error: EOF detected by READ-CHAR in the middle of expression
というエラーメッセージになっていて、何かの式を読み取る途中で(つまり再帰的に呼ばれていて)EOFに遭遇した、というものになっています。
これは、READ-CHARの設計者も満足な実装ではないでしょうか。
■
■
HTML generated by 3bmd in SBCL 1.2.9