課題とかでschemeとかやらされた。

方言多すぎて情報探しづらい...(д
とりあえず課題は「ストップウォッチをグラフィカルに実装する」だそうだ。


と、いうことで、どうにか探し出した情報とか。
とりあえず前提はmzschemeで。
drschemeもいけるのかな?

とりあえず時刻の類。

これがないとストップウォッチ作れへん。


srfiとかなんとかという仕様(?)みたいなのが色々あるようで、その19番に時間関係があるらしい。
とりあえず現在時刻取得とか。

(require (lib "time.ss" "srfi/19"))

; 現在時刻を取得する。
(define time (current-time))
; timeから秒、ナノ秒を取得する。
; 秒は1970年からの経過秒と思われ。
; あとナノ秒は0〜999,999,999を返す、とか書いてあるのだがなんか7桁までしか出ない。なぜ?
(time-second time)
(time-nanosecond time)
; あと差分が取れる
(time-difference time1 time2)

; あとdateってのもある。
(define date (current-date))
; 中身は年 月 日 時 分 秒 ナノ秒。あとzone-offsetってのも入ってるけど、これなんだろ。JSTとかあぁいうのかな?。興味ないので検索せず。
; それぞれ(date-ちょめちょめ )でアクセスできる
(date-year date)
(date-month date)
; などなど。なぜかdateにはdifferenceがない。なんでだよ。
; date->stringとか便利そうなのも発見。
; 第に引数にフォーマットを渡せるらしい。
(date->string date "~Y/~m/~d(~a) ~H:~M:~S")
; schemeのformat系はチルダが基本なのか...。慣れないな。

こんな感じか?
まぁ、実際に使ったんは(current-time)と(time-second),(time-nanosecond)だけだがな。

GUIに関して。

これも課題の仕様にグラフィカル、とか書かれてたんで...(д

(require (lib "graphics.ss" "graphics"))

(open-graphics)	; まずこれやらんといけんらしい。

; 100x100でタイトルが"hoge"なウィンドウを作る。
; ビューポートとかいうらしい。
(define vp (open-viewport "hoge" 100 100)) 
; で線とか引くときは
((draw-line vp) (make-posn 0 0) (make-posn 100 100))
; と言う感じで。
; draw-なんたら系はビューポートを受け取ってlambdaを返すらしい。
; draw-line :: Viewport -> (Posn -> Posn -> IO ()) 
; って感じかな?Haskell適に言うと。
; あと字を書いたり、四角を書いたり。
((draw-string vp) (make-posn 10 10) "hoge")
((draw-solid-rectangle vp) (make-posn 0 0) 100 100 "white")
; solidにしてやらんと塗りつぶされないようだ。

; キー入力関係
; (get-key-press)と(ready-key-press)の両方があるらしい。
; 前者はブロッキング、後者はノンブロッキングなキー入力判別。
; readyのほうはキー入力がなければ#fが返ってくるのでまずチェックをすること。
(letrec ((key-press (ready-key-press)))
	(cond ((equal? key-press #f) (print "no keys pressed"))
	      ((equal? (key-value key-press) #\a) (print "key 'a' pressed"))))
; こんなカンジ。コンパイラ通してないからtypoしてたらスマンよ。
; letrecは局所変数の定義らしい。
; で、まずkey-pressが#fかどうかのチェック。
; その後(key-value)を使って「どのキーが押されているか」を取得。
; #\aならaのキー。スペースなら#\spaceと比較すればok
; readyのほうを使うときはループの中で使わないと非実用的〜。

こんだけ調べるのに結構時間かかった。
mzschemeの情報欲しいのにgaucheばっか引っかかりやがる。
方言多すぎじゃ!!激氣。


あとmzschemeはインタプリタが使いづらい。
rlwrap必須〜。