2016-04-07-01-ストリーム入出力のおさらいとか
>> Site top >> weblog >> 月別アーカイブ >> 2016年04月のlog >> 2016-04-07-01-ストリーム入出力のおさらいとか
最終更新日付:2016/04/07 01:00:00
ストリーム入出力のおさらいとか
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-2021 project-enigma.
Generated by CL-PREFAB.