2019-12-19-01-fistのguile拡張でstream入出力
>> Site top >> weblog >> 月別アーカイブ >> 2019年12月のlog >> 2019-12-19-01-fistのguile拡張でstream入出力
最終更新日付:2019/12/19 01:00:00
fistのguile拡張でstream入出力
2019 年 12 月 19 日
fist の guile 拡張はかなり色々なことができるようになってきているが、まだ色々足りない。今回は、C++ の iostream みたいなことの実現に向けた努力について。
もともと、Guile には入出力ポートという考え方があって、それを使えば標準入出力やファイルなどを同じように扱うことができる。これはだいたいどの言語にもあるお決まりのやつだ。write とか display 関数を使えば、ポートへの出力ができる。
(write VALUE PORT)
PORT パラメータは省略することができて、その場合は「カレント出力ポート」に出力される。
(write VALUE)
これに対して、自分がやりたいことは大体以下の通りだった。
- 一回の呼び出しで複数値を連続出力したい
- iomanip みたいなことがしたい。つまり、マニピュレータ出力によって出力書式を制御したい
- 標準出力や文字列、ファイルに加えて、fist データのノート部分への入出力ストリームが欲しい
最初のは、まぁ既存の入出力ポートの仕組みにラッパー関数みたいなものを用意してやれば行けるだろう。しかし、2番目以降はどうも無理っぽい(自分がドキュメントを見落としているだけかもしれないが)。guile のドキュメントにはポートを自作する方法も書いてはあったが、「iomanip みたいの」とあわせて、すべて既存の仕組みで実現できるかは怪しかった。あと、まるごと自作する場合、std::iostream をラップする感じになるので、iomanip が特に簡単に実現できるような気がしたのだ。
そんなわけで、先日からせこせこと作業している...のだけど、やはり標準の機能というのは結構ボリュームがあるもので、自分が普段使っている(そしてguile拡張でも使いたいと思っていた)のは氷山の一角に過ぎないことに気付かされ、途端に面倒になる。そこをぐっとこらえて頑張るのはいつものことだ。そしてそれがうまく行くとは限らないのもいつものことだ。
前述の通り、std::iostreamの薄いラッパーになるため、マニピュレータ自体の実装は割と簡単に出来上がった。しかし、そのせいもあってfmtflagsがすごく面倒に感じて、普段まったく使わない入力ストリームが山の彼方の空遠く、という感じになってしまっている。要するに、まだ終わってないしやるかどうかもわからない、ということだ。
‥‥‥上記までを下書いてしばらく放置していたのだけど、昨日の段階で出力ストリームの扱いはあらかた完成した。大体以下のようなことができるようになってきている。うん、fist: プレフィクスだらけになるな。
* (fist:write-to fist:cout fist:right (fist:setfill #\space) (fist:setw 8) 666 fist:endl (fist:setw 8) 1234 fist:endl (fist:setw 8) -28 fist:endl) 666 1234 -28
問題は入力ストリームだ。基本的に使わないので、やる気が出ないんだよな‥‥‥。
コメント
このページのタグ
Page tag : fist
Copyright(C) 2005-2021 project-enigma.
Generated by CL-PREFAB.