2011/11/09

gaucheのtext.progressとtputコマンド(コマンド?)

gaucheにtext.progressなるモジュールがあることを知ったので、早速サンプルを動かしてみました。
ふと疑問に思ったのが、こういうことやる時ってcursesってヤツがいるんじゃないの?ってこと。ソース見てみたら、CRで行頭復帰してるだけだった。ウロコー!

こんな感じ。
#!/usr/local/bin/gosh

(use srfi-1)
(for-each (^i (format (current-output-port) "~a\r" i)
              (flush)
              (sys-select #f #f #f 50000))
          (iota 256))


Gauche-cursesとかGauche-ncursesはないかとググったら、メンテされてなさそうなのがひっかかった。ついでにChicken Schemeのeggを調べたらncursesがあった。あとで試してみよう。
で、curses拡張がないならどうしたらいいのか?調べてみたらtputなんてものがあるんですね。
試しにやってみたらこんな感じ。topコマンドを実行したときみたいな。
!/usr/local/bin/gosh

(use gauche.process)

(dynamic-wind
  (^ _ (run-process '(tput "civis"))
     (run-process '(tput "clear")))
  (^ _(do ((i 0 (+ i 1)))
          ((= i 256))
        (format (current-output-port) "~a\r" (make-list 100 i))
        (sys-nanosleep 10000000)
        (run-process '(tput "cup" 0 0))
        (flush)
        (sys-select #f #f #f 50000)))
  (^ _ (run-process '(tput "cnorm"))))

こりゃ便利だなーということで、以前作ったライフゲームをコマンドにしてみた。
$ ./lifegame2.scm -s 100 -w 30


プログラミングGauche

0 件のコメント:

コメントを投稿