掃除した

親が出張ついでに来るってので3・4限のプロ2(Java)をぶっぱして掃除をしました。残ったのは湯船と机の上(PC)の周りくらいで多分がんばった方だと思います。
風呂を入れる時の注意ポイント

  • ガスの電源を入れる。ミスると水風呂になる。
  • お湯の蛇口をひねる前にシャワーとの切り換えノブが蛇口の方になっているか確認する。ミスると右腕に冷水がかかる。

無駄に難易度高いなこの家…。初見殺しどころか3年目になってもまだやるんだが…。


毎週ここのネタにしてたコンパイラ構成論ですが、普通に字句解析に入って正規表現オートマトンの関係をやり始めました。計算理論の方でちょうどやり始めたところだし、多分そんなに難しいこともないのでここからは多分全員耐えるでしょう。人数かなり減ったと思うけどね!!
一応次回までということになっている課題ですが、よくわかんないのでもう一度ヒントを言ってくださいとの発言がありました。基本的にinterExpが(値, テーブル)の組を返すように改変すればいいです。ただしそれだけではなく受け取りを行っている箇所も全部変更しないといけません。授業のページhttp://www.cs.is.noda.tus.ac.jp/~mune/keio/b/に実行できるべきコードを載せておいたことがアナウンスされました。まあもう知ってたけど。ただし例2は少々難しく、List.fold_left*1を使う必要があるというヒントが出ました。難しいのでできなくても構わないからうまくいかない理由を書いて出すという妥協ルートが提案されました。授業サイトが更新された頃にはもう例2は動くようになってたけど。出してたの1人しかいなかったような…。まあ来週までだし…。


6. 次のRectクラスは長方形を表すクラスである。このクラスはPointクラスを利用しているものの、継承は用いていない。Rectクラスの定義を修正して継承を利用するようにせよ。Pointクラスは各自、適切に定義せよ。また、幅15、高さ20の長方形で左上の点を(5, 10)とするとき、Rectクラスを用いて右下の点を座標を計算するプログラムを作成せよ。

public class Rect {
  protected Point upperLeft; // 左上の点
  protected int width, height;
  public Rect(int x, int y, int w, int h) {
    upperLeft = new Point(x, y);
    width = w; height = h;
  }
  public Point getLowerRigth() { // 右下の点を返す
    return new Point(upperLeft.x + width, upperLeft.y + height);
  }
}

ちょっとした誤字(点を座標を、Rigth)やprotectedフィールド(今回は継承の話だったのでprotectedの有効範囲を実感するのが優先。ここで無理に実用的にいくと回りくどくわかりにくくなる)はいいとして、RectクラスがPointクラスを継承するのはいかんでしょう。よくある言葉で言うとRect has a Point. Rect is not a Point.(→「is-a関係」「has-a関係」)

Point p = new Rect(...);

これは違うでしょう。Effective C++の例では混乱したものの、このくらい私でも分かりますよ。講義にも出ずに勝手にこんなこと書くのもどうかと思うけど…。

*1: fold_left(f, a, [b1, b2, ...])→f(...f(f(a, b1), b2)...)