本日の良ゲー

そういえば今日の昼に築3年の耐震調査的な何かがあって留守の場合は管理人立会いのもと行いますとかいう紙が郵便受けに貼られてたけど1限のコンパイラ構成論のため特に何もせず学校に向かいました。


本日の良(辱)ゲー

let initTable = function x -> raise No_such_variable
let update var vl t =
  function x -> if x = var then vl else t x

「変数名と値の組のリストで保持するとかしてもいいのですが、関数型っぽい書き方をしています。」
そして1行目を見て電流走る―!
空の変数テーブルが返すのが引数に変数名の文字列xをとりNo_such_variable例外を起こす関数…!これはいけません。そして2行目は案の定である。
JavaScriptにすると読みやすかったりするかな?var(variable):変数名、vl(value):値、t(table):追加先のテーブル、です。

function initTable() {
  return function(x) { throw "NoSuchVariable"; }
}
function update(var, vl, t) {
  return function(x) {
    if (x == var) {
      return vl;
    } else {
      return t(x);
    }
  };
}

initTableの返す関数にはxにどんな変数名を渡してもNoSuchVariableでエラーになります。空の変数表なので正常動作です。update("a", 5, initTable())が返すのは、xに"a"を渡すと5を返し、それ以外ならinitTable()("a")を返す(エラーになる)関数です。update("b", 10, update("a", 5, initTable()))を考えてみてください。"b"には10が、"a"には5が返り、それ以外はエラーになる関数になるはずです。関数のリンクリストのイメージができれば合格です。関数型思考を知らない人にはかなりの無理ゲー。同じものを何度も登録すると最後に登録したものが出てきますよね的な質問をした人は分かってます(ついでに昔のデータがメモリを無駄に占有し続けます)。
ついでにJavaをやってることをいいことにJavaオブジェクト指向がオブジェクトのデータを内部に隠ぺいして(カプセル化)メソッドでアクセスすることを引き合いに、この書き方はメソッドが関数そのものになった純粋な抽象化だのなんだの言いだしました。Javaはまだ2回しか講義が行われておらず、フィールドにprivateなんてつけてない(publicでもないけど)のでカプセル化なんてみんな知りません。でもKSKくんの話だとOOPもまだみんな知らないのにAOP(アスペクト指向プログラミング)についての講義を延々と聞かされレポートを書くという超良科目もあったみたいなので仕方ないね。
ちなみに卒業単位の般教を4年に全残ししたどる氏によると、試験は計算理論でも出てくる文脈自由文法しか出ないので実は楽とのこと。残念ながら最初の方のこういうので諦めて★を取られる*1者が多いという。
講義のサイト
http://www.cs.is.noda.tus.ac.jp/~mune/keio/b/


明日は学校の開校記念日でお休みということで皆さんやけに早く出て行っちゃいました。私と三毛猫さんとBatoくんに加え、MMC*2のはるちゃんさんとI川さん*3のやけにレアな居残り組に。レアすぎる麻雀の後、「俺と飯が食えるなんてかなりレアだぜ」。某害悪ラーメン屋の近くの讃岐うどんは対抗馬となり得るのか。
あ、消灯寸前流局寸前で北単騎チートイ張ったのでプンリーぱなしたらプンリー・ホウテイ・チートイ・ドラ1になりました。仕方ないね。Batoくんいきなり親の三倍満ツモってたしね。

*1:成績表に書かれる、合格A/B/C、不合格D、放棄★のこと

*2:モリーマイコンクラブ。KDVの隣の(ry

*3:実はKDV-MMC緋想天部門成立に関わる重要人物。