図形言語のための環境構築(Windows向け)

Windowsで図形言語を使うための環境として、MIT-Schemeを使うことにした。理由はセットアップが楽だから。何しろ6問しか練習問題がないので、環境構築に苦心する意味はない。

私はここに書いてある内容を参考にして、次のような作業を行った。

MIT-Schemeのインストール

こちらからインストーラを落としてきてインストールする。途中でデータベースを保存するディレクトリを訊かれるので、適当なパスを入れておく。私はMy Documents\SICP\u6001を指定した。このディレクトリの下にはworkとpsetsというディレクトリが作成される。

scmファイルのダウンロード

こちらから4つのscmファイルを落としてくる。

それぞれ、go.scm, hend.scm, hutils.scm, prmpnt.scmという名前で上記のpsetsディレクトリに保存する。

go.scmの修正

先頭に謎のif式があって、ロードすると警告が出る。どうも、g1, g2, g3という束縛がなかったらこれらを束縛する処理らしい。そんな束縛はないと判断して適当に直す。

;(if (lexical-unreferenceable? user-initial-environment 'g1)
;    (define g1 false))
(define g1 false)
;(if (lexical-unreferenceable? user-initial-environment 'g2)
;    (define g2 false))
(define g2 false)
;(if (lexical-unreferenceable? user-initial-environment 'g3)
;    (define g3 false))
(define g3 false)

その後ろに他の3つのscmファイルをロードする記述がある。ファイルのパスはworkディレクトリからの相対パスで次のように修正する。

(define (setup)
  ;(load "/home/sicp/psets/ps4/prmpnt.scm")
  (load "../psets/prmpnt.scm")
  ;(load "/home/sicp/psets/ps4/hutils.scm")
  (load "../psets/hutils.scm")
  ;(load "/home/sicp/psets/ps4/hend.scm")
  (load "../psets/hend.scm")
  (setup-windows))

更にその下に、3つのウィンドウを作成する手続きがある。個人的に3つもウィンドウは要らないと思ったので、2つをコメントアウト。ウィンドウサイズも大きくした。

(define (setup-windows)
  (if (and g1 (graphics-device? g1))
      (graphics-close g1))
  (begin (set! g1 (make-window 256 256 -10 +10))
	 (graphics-set-coordinate-limits g1 0.0 0.0 1.0 1.0)
	 (graphics-operation g1 'set-window-name "Graphics: g1"))
;  (if (and g2 (graphics-device? g2))            ; ウィンドウは一個で十分
;      (graphics-close g2))
;  (begin (set! g2 (make-window 256 256 -10 +320))
;	 (graphics-set-coordinate-limits g2 0.0 0.0 1.0 1.0)
;	 (graphics-operation g2 'set-window-name "Graphics: g2"))
;  (if (and g3 (graphics-device? g3))            ; ウィンドウは一個で十分
;      (graphics-close g3))
;  (begin (set! g3 (make-window 256 256 -10 +630))
;	 (graphics-set-coordinate-limits g3 0.0 0.0 1.0 1.0)
;	 (graphics-operation g3 'set-window-name "Graphics: g3"))
  )

paint手続きでは、引数としてウィンドウとpainterを受け取る。上記の変更によりウィンドウはg1しかないので、painterだけを受け取る手続き"paint-g1"を定義しておく。

(define (paint-g1 painter)
  (paint g1 painter))

hend.scmの修正

必ずしも必要ではないが、hend.scmでwave手続きを定義しておくと説明で出てくる図を実際に描画できて便利。wave手続きはこちらに書いてある。問題2.49で作るんだけどね。