2016-04-07-01-ストリーム入出力のおさらいとか - project-enigma

2016-04-07-01-ストリーム入出力のおさらいとか

>> Site top >> weblog >> 月別アーカイブ >> 2016年04月のlog >> 2016-04-07-01-ストリーム入出力のおさらいとか

最終更新日付:2016/04/07 16:37:31


ストリーム入出力のおさらいとか

2016 年 04 月 07 日

ちょっと気分を変えて、CL-IOSTREAM をイジってみることにした。入出力って、普段使わない部分は無知に等しいから、まずはこの本でおさらい。

C++ の標準ライブラリに関してはこの本にかなりお世話になっている。

CL-IOSTREAM を最後にイジったのは今年が明けた直後くらい、ちょうど思いつきで steam を作成しはじめる直前だった。かれこれ3ヶ月ぶりですなお久しゅうございます。もう完全に忘れているのでおさらいしつつ、新鮮な目で見てみると気付くことがある。

manipulator クラス、要らないんじゃない?

manipulator クラスというのは、ストリームに対して書式を指定するためのもので、C++ 標準ライブラリにおける iostream ライブラリのマニピュレータを模倣したものだ。iostream ライブラリでは、マニピュレータは『ストリームへの参照を受け取ってストリームを返す関数』だ。CL-IOSTREAM ではこれを模倣するため、manipulator クラスを導入、総称関数 operator_<< にこれが渡された場合に特殊な動作をするようになっていた。

しかし、時間を置いて見返してみると、いっそのこと「関数だったらマニピュレータとみなす」という決め打ちでいいような気がしてきた。関数そのものをストリームに流し込むというのはちょっと考えられないからだ。

というわけで、manipulator クラスを追放し、これまで通りの動作をするところまで確認できた。あとは懸案になっている、入力ストリームの問題に取り組まなければならない。C++ では変数自体が型付けされているから、以下のように書くことができる。

int a;
float b;
cin >> a >> b;

 

しかし、Common Lisp は変数自体が型付けされていないから、同じように書いたとすると、どのような値を読み込むのか指定できないのだ。

(let ((a nil)
      (b nil))
  (_>> cin a b))

 

今考えているのは、それぞれの値を読み込む直前に型を指定するようなマニピュレータを置くことだ。以下ではキーワードを渡している。

(let ((a nil)
      (b nil))
  (_>> cin :integer a
           :float   b))

 

無論、拡張性を考えるならばキーワードではダメで、ストリーム出力の場合と同じようなマニピュレータにする必要がある。そこらへんを考えていくのが今後の作業なんだな。頑張れ自分。

 

コメント

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

 

このページのタグ

Page tag : CL-IOSTREAM

 

 


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