2016-04-08-01-厄介だぞストリーム入力 - project-enigma

2016-04-08-01-厄介だぞストリーム入力

>> Site top >> weblog >> 月別アーカイブ >> 2016年04月のlog >> 2016-04-08-01-厄介だぞストリーム入力

最終更新日付:2016/04/08 00:05:00


厄介だぞストリーム入力

2016 年 04 月 08 日

考えれば考える程、CL-IOSTREAM における入力機構には困難が多いということに気付かされる。今回はそんな話。

最初、自分は無邪気にもこんなお試しコードを書いた。

(defgeneric operator_>> (stream arg))

(defmethod operator_>> (stream arg)
  (setf arg (read stream)))

 

当然ながらこれはダメダメで、メソッドに渡された argsetf したところでそもそもの呼び出し元の変数が書き換わるわけではない。このことから、ユーザコードで使用される _>> 演算子はマクロでなければならず、格納先に operator_>> の結果を setf するところまで展開しなければならないのだ。そんなことまで忘れている自分が心配になる。

で、次の問題。変数そのものが型付けされていない Lisp において、それぞれの入力でどのような型の値を期待しているかをどう記述するか。最初は以下のようなものを考えた。

(_>> cin integer a
         complex b)

 

integercomplex などの型指定子を配置すると、後続する変数への入力がその型であることがチェックされる。型指定子は最初はキーワードシンボルにしようかと考えたが、拡張性を考えると単なるキーワードシンボルでは都合が悪いので普通のシンボルにした。

しかし、この方法はうまくないのだ。_>> 演算子はマクロだから、展開時点では integera も等しくシンボルだ。この状態でうまく動作させようとすると、結局 _>> マクロが「どのシンボルなら型指定子とするか」を知っていなければならない。だからこの方法はうまくない。

次に考えたのは、次のようなものだ。

(_>> cin anything
         (a integer)
         (b complex))

 

つまり、_>> がマクロなら、そのパラメータはどうとでもなる。だから型を指定したければ単一のパラメータが (場所 型指定子) になっていれば良い‥‥‥そう考えたのだが、これは別の意味でやっぱりダメなのだ。それは、パラメータが格納先の「場所」を示す以上、以下のような記述もできる必要があるからだ。

(_>> cin (car lst) (cadr lst))

 

そういうわけで、他の方法を考える必要がある。しかし、こういうコトも書いてみるもので、書くことによって(美しくはないにせよ)解決策らしきものが見えてきた。次回はそれについて書くとしよう。

 

コメント

このページにコメントする

 

このページのタグ

Page tag : CL-IOSTREAM

 

 


Copyright(C) 2005-2017 project-enigma.
Generated by CL-PREFAB.