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

あのねノート

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

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

後編です!初心者は黙ってチュートリアル
momo-moemoe.hatenablog.com
クイックチュートリアル(Quick: An Introduction to Racket with Pictures)の7章からです。

前回は6章までやったのですが、7章になっていきなりlexical scopeという用語が出てきて戸惑ったので調べてみましょう!(白目)
静的スコープ - Wikipedia
Common Lispの例が出てきておおっと言ってたりしたんですけど、要するに()の中で宣言したことは()の中だけで有効だよっていうことなのかしら。
よくわからないときはチュートリアルで書いて動かしてみよう。
どうやら次の2つを比較してみろといわれてるみたい。

(define (rgb-series mk)
  (vc-append
   (series (lambda (sz) (colorize (mk sz) "red")))
   (series (lambda (sz) (colorize (mk sz) "green")))
   (series (lambda (sz) (colorize (mk sz) "blue")))))

(define (rgb-maker mk)
  (lambda (sz)
    (vc-append (colorize (mk sz) "red")
               (colorize (mk sz) "green")
               (colorize (mk sz) "blue"))))

rgb-seriesはcircleを受け取ると次のように動きます。
f:id:momo_moemoe:20160813171242p:plain
しかし、rgb-makerはただ関数を受け取るだけでは動きません。
f:id:momo_moemoe:20160813171247p:plain
seriesと組み合わせて動きます。
f:id:momo_moemoe:20160813171251p:plain
rgb-makerだけだとsizeの規定がないからsizeを受け取らせるseriesと組み合わせないといけないのかなあ…スコープよくわからないので誰か教えてほしい感じです。チュートリアルではさらっと流されちゃいました☆

ここでおなじみリストです。
(list ほげ ふが ぴよ)とすると'(ほげ ふが ぴよ)となるあれですね。
map関数でリストのそれぞれに同じ処理をしたリストを返すことができます。

(define (rainbow p)
  (map (lambda (color)
         (colorize p color))
       (list "red" "orange" "yellow" "green" "blue" "purple")))

pに(square 10)のような形を入れると、lambdaの引数のところでリストの内容を順番に受け取って処理してまたリストにしてくれます。
(rainbow (square 10))は次のような処理と同じになります。

(list (colorize (square 10) "red")
      (colorize (square 10) "orange")
      (colorize (square 10) "yellow")
      (colorize (square 10) "green")
      (colorize (square 10) "blue")
      (colorize (square 10) "purple"))

f:id:momo_moemoe:20160813172354p:plain
ね。そういえば海外では虹は6色なんですね。
同じように関数とリストを受け取るものとしてapplyがあって、

(apply vc-append (rainbow (square 10)))

とするとどうやら次のようになるみたいです。

(vc-append (colorize (square 10) "red")
           (colorize (square 10) "orange")
           (colorize (square 10) "yellow")
           (colorize (square 10) "green")
           (colorize (square 10) "blue")
           (colorize (square 10) "purple"))

f:id:momo_moemoe:20160813173155p:plain
リストじゃなしに返ってくるんですね。なるほど。

と、ここまでで基本的な機能は網羅できたっぽくて、ここから他モジュールを読みこむ説明が始まりました。

(require pict/flash)

とすると次のような形も呼び出せます。
f:id:momo_moemoe:20160813173509p:plain
こんなライブラリもあるんですね。じわじわ来た。
逆に今作っているプログラムの中の関数をほかのプログラムで使いたいときは、(provide 使いたい関数名)をプログラムの頭につけると同じディレクトリの他のプログラムでその関数が使えます。なるほど。

(require slideshow/code)

として(code Racketの式)とするとRacketの式が画像になって返ってきます。
f:id:momo_moemoe:20160813173956p:plain
下の大きな(circle 10)が画像です。あーこれをslideshowに使うのか~という気持ちになった。
ここでマクロの説明が始まっているのだけど、詳しくはもっと別のを読んでねという感じっぽいのでここでは書くのをやめます。define-syntaxというもので新たに文法を作れるみたい。
そのうち勉強しないといけないんだろうな…難しそうだなあ…

続きを読んでみると関数型だけどオブジェクトも使っちゃうね!という話になってきました。このへんは追い追い別に勉強したほうがよさそう。
というわけでなんだかぼんやりしたかんじになっちゃいましたが、初級チュートリアルは終了みたいです。後半の方はなんだか難しかったので教えてえらい人って感じだ…がんばります。