Schemeの勉強会をやることになったのでメモ

Lispについて教えてほしいということで始まった。
教える相手2人はLispについて名前を聞いたことがあるくらい(1人はプログラミング自体したことがない)で別にLispSchemeである必要は全くないので、Rubyをすすめたのだけど受け入れられず、結局Schemeになった。
実際にどう進んでいくかは未定だけど不安なのでメモ。

プログラミング環境を整えるのが面倒

SchemeLispでプログラムを書くのは、最初の敷居が他の言語より大きいと思う。
たいていの言語ならとりあえず処理系を入れれば、インタラクティブにプログラムを打ち込んで実行してみたり、ふだん使っているエディタでプログラムを書いて実行してみたりできる。
SchemeLispの場合、最低でもカッコの対応を示してくれるエディタがないと短いプログラムも書いていられないし、インタラクティブセッションでも直接プログラムを打ち込むのはたいへんだったりする。すんなりEmacsに移行できれば良いのだろうけど、そうでない場合は手に入る情報も少なくて困ることになる。強制的にEmacsを使わせてその代わりプログラムに便利な操作もふくめ懇切丁寧に教えるというのがひとつのやり方かもしれないけど、Emacsにどうしても慣れられなくて知識もない身ではそれは無理だし。

教える必要のあることが少なすぎる

教えないといけないことが少ないというのは悪いことではないけど、教える側からするとやりにくい面もある。
文法について教えることが色々あれば、とりあえずはそれを説明して簡単なプログラムを書いてもらってだんだんとプログラムに慣れてもらうというやり方ができる。LispSchemeだと教えないといけないことが少ないから、やろうと思えばどんどん話を進めてしまえる。Little Schemerみたいに再帰とリスト操作を丁寧にやるのが良いのかもしれないけど、それはそれで退屈にならずに進めるのは大変な気がする。

プログラムの普通の書き方がわからない

これは別にSchemeに限ったことではないけど、そもそもプログラムを書いていくときの標準的なやり方がわからない。行き当たりばったりな自覚はあるけど、どう変えればいいのかわからない。プログラムの書き方を説明する場面では、自分のやっているやり方を教えることになりそうだけど、それはかわいそうな気がしてしょうがない。できればまともな書き方を教えたい。
たとえばテストを別のファイルに書くことにすると確実にテストを書かない結果になるので、Gaucheで書く場合は、

#!/usr/bin/env gosh

(use gauche.parseopt)
(use gauche.test)

(define (main args)
  (let-args (cdr args)
    ((do-test "test")
     . restargs)
    (cond
      (do-test (all-test))
      (else (all-test)))))

(define (all-test)
  (test-start *program-name*)
  (test-end)
  )

みたいなテンプレートファイルに、プログラム本体もテストも一緒に書いている。こうでもしないとテストを書かないからだけど、なんかズレたやり方な気がする。でもどうして良いかわからない。「テストは必ず書け」とか「テストは自動で簡単に実行できる環境を作れ」みたいな言葉はよく目にするけれど、それを実践するためのやり方を知りたい。
それからテストの書き方自体もよくわからない。どうやってテストすれば良いのかわからないまま放置する場合が多いし。自分がわからないのに人に教えようがない。