2016-01-08-01-思いつきでもないiostream - project-enigma

2016-01-08-01-思いつきでもないiostream

>> Site top >> weblog >> 月別アーカイブ >> 2016年01月のlog >> 2016-01-08-01-思いつきでもないiostream

最終更新日付:2016/01/08 22:35:39


思いつきでもないiostream

2016 年 01 月 08 日

随分前から実現できないかな—、と思っていたのがストリーム入出力。もちろん Common Lisp でだ。C++ 標準ライブラリの iostream と同じものができたらいいなという野望があるものの、そもそも自分は iostream のことを良く知らない。もう STL に夢中過ぎて、C++ 標準ライブラリの他の部分には全然目が行ってなかったわけでもうなにがなんだか。

そんなわけで、先日言及した『C++標準ライブラリ チュートリアル&リファレンス』を読んでおさらいをするところから。今回は、その道すがらどうにか動き始めた CL-IOSTREAM の話。

いきなりだけれど、ひとまず現状でこんな感じで動作するようになっている。

(dotimes (i 10)
  (let ((a (- (random 1000) 500))
        (b (- (random 1000) 500)))
    (_<< cout showpos (setw 4) a " * "
                      (setw 4) b " = "
                      (setw 7) (* a b) endl)))

;-> +285 * +182 =  +51870
;   -129 * -318 =  +41022
;   -392 * -461 = +180712
;   -484 *  -47 =  +22748
;   -193 * -164 =  +31652
;   +226 * +429 =  +96954
;     +4 * -288 =   -1152
;   -364 * +372 = -135408
;   +207 * -162 =  -33534
;   -376 *  -54 =  +20304
;=> NIL

 

C++ の iostream を御存知の方なら何をやっているのかすぐにわかるだろう。最初に来るべき cout が2番目にあるのがなんとも気持ち悪いが、これは仕方がない。前置記法まで崩すことは考えていないよ。

これは数値を幅指定で揃えて出力するサンプルなので、showposnoshowpos に変えるだけで + 記号はでなくなるが、桁はキレイに揃った状態が保たれる。

(dotimes (i 10)
   (let ((a (- (random 1000) 500))
         (b (- (random 1000) 500)))
     (_<< cout noshowpos (setw 4) a " * "
                         (setw 4) b " = "
                         (setw 7) (* a b) endl)))

;-> -394 *  278 = -109532
;   -336 * -389 =  130704
;   -170 *  271 =  -46070
;   -282 * -351 =   98982
;     51 * -187 =   -9537
;    -24 * -275 =    6600
;    374 * -490 = -183260
;   -471 *  145 =  -68295
;    299 * -205 =  -61295
;    383 *  419 =  160477
;=> NIL

 

まぁ、こんな感じでざっくりだけれど最低限の動作をそれをするようにはなっている。細部はまだまだだし、そもそも動いているのは ostream だけなのだ。大きな悩みである istream はまだ手つかずだし、先は長い。

 

コメント

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

 

このページのタグ

Page tag : CL-IOSTREAM

Page tag : Common Lisp

 

 


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