読者です 読者をやめる 読者になる 読者になる

あのねノート

せんせいあのね、パソコンで字が書けるようになったよ

Racketでお絵かき~Racketクイックチュートリアルをやってみた(前編)

Racket

実験で使ったRacketのお勉強をしようというわけでRacketのドキュメントを眺めていると3種類のチュートリアルが用意されていたので手っ取り早くやってみようと思います。初心者は黙ってチュートリアル。ということでまずは入門編から。
Quick: An Introduction to Racket with Pictures
画像をいじりながらRacketの基本文法を学ぼうという内容。Racketにはプレゼン用のスライドを作るためのslideshowというライブラリーがあるのでそれを使うようです。これで手っ取り早く画像が使えます。

最初の方はDr.Racket自体の使い方の説明です。
実行(Run)を押すと上画面のプログラムを走らせた状態で下画面にコマンドを打ち込んで操作できます。エラーが出るとピンクのハイライトが入るよみたいな説明までしてくれて親切。
あと関数名にカーソルを置いてF1キーを押すとその関数のドキュメントが開きます!賢い!便利!
f:id:momo_moemoe:20160813162237p:plain
Racketのドキュメントはウインドウサイズに幅を合わせてくれるのでブラウザとDr.Racketで半分ずつウインドウを使うとドキュメントを見ながらプログラムを動かせて多少便利な気がします。

画像をいじるということで丸と四角と正方形を定義してみます。

(define c (circle 10))
(define r (rectangle 10 20))

(define (square n)
  (filled-rectangle n n))

こうなります。
f:id:momo_moemoe:20160813162420p:plain

次は内部定義です。実は1回生でSchemeを勉強したときにここでつまずいてます。つらい。

(define (four p)
  (define two-p (hc-append p p))
  (vc-append two-p two-p))

(hc-append p p)でpを横に2つくっつけることができるので、それをtwo-pと定義します。(vc-append p p)でpを縦に2つくっつけることができるので、(vc-append two-p two-p)でpが2×2の形に並びます。
f:id:momo_moemoe:20160813162624p:plain
外のdefineの中だけで使える関数を()内でdefineで定義できるという感じ。昔のわたしは()の対応で頭がこんがらがったのだと思います。つらい(2回目)。

local bindということで、letとlet*もここで学べます。(let ほげほげ)の中だけで変数を定義することができる感じ。
letの中の変数定義は丸カッコと習っていたのですが、四角いカッコでもいいみたいです。後者のほうが見やすくないですか?

(define (checker p1 p2)
  (let ([p12 (hc-append p1 p2)]
        [p21 (hc-append p2 p1)])
    (vc-append p12 p21)))

(define (checkerboard p)
  (let* ([rp (colorize p "red")]
         [bp (colorize p "black")]
         [c (checker rp bp)]
         [c4 (four c)])
    (four c4)))

f:id:momo_moemoe:20160813162905p:plain

関数を受け取る関数もできます。

(define (series mk)
  (hc-append 4 (mk 5) (mk 10) (mk 20)))

これで(series circle)を実行すると、

(hc-append 4 (circle 5) (circle 10) (circle 20))

の結果が返されます。
これにlambda式も組み合わせることができます。

(series (lambda (size) (checkerboard (circle size))))

これぱっと理解できなくて何度も読みなおした…
f:id:momo_moemoe:20160813163147p:plain
目がちかちかする。

lambdaで関数を受け取ることもできます。

(define series
  (lambda (mk)
    (hc-append 4 (mk 5) (mk 10) (mk 20))))

1回生の時はlambdaの意味が分かってなかったなあと思いました。defineと同じように使えるんですね…

やっとここで半分です。説明が下手なせいで長いですがチュートリアルではここまで割とさらっと読めるし英語の方が分かりやすい節があります。
後半はれきしかるすきーぷとか言い出してどんどんややこしくなりそうですががんばりたいです。