Skip to content

Latest commit

 

History

History
92 lines (73 loc) · 1.88 KB

18.7-.md

File metadata and controls

92 lines (73 loc) · 1.88 KB

18.7.1

書くだけ問題。なぜ問題にしたんだろう

Backup2Counter = { get: Unit -> Nat, inc: Unit -> Unit, reset: Unit -> Unit, backup: Unit -> Unit, reset2: Unit -> Unit, backup2: Unit -> Unit, };

Backup2CounterRep = { x: Ref Nat, b: Ref Nat, b2: Ref Nat, };

buckup2CounterClass = \r: Backup2CounterRep. let super = backupCounterClass r in { get = super.get, inc = super.inc, reset = super.reset, backup = super.backup, reset2 = _:Unit. r.x := !(r.b2), backup2 = _:Unit. r.b2 := !(r.x), };

18.11.1

検査器が無いので保留。 書くだけっぽいが長そう……

18.13.1

  1. newでIDを生成して渡し、classではIDを受け取るようにする。sameObjectの判定ではそのIDを利用する。Repに記録する必要はない。 親クラスで実装されている場合、子クラスでは渡すだけ。

e.g.)

setCounterClass = 
  \r: SetCounterRep. \self: Source SetCounter. \id: Num
  { ...
    sameObject = \obj:setCounterClass. obj.id == id
  }

pros

  • IDが衝突しない

cons

  • newする側でIDを管理しないといけない
  1. class側でIDを生成する。コンストラクタで処理する感じ。

e.g.)

setCounterClass = 
  \r: SetCounterRep. \self: Source SetCounter.
  let id = (何かしらのID生成) in {
    ...
    sameObject = \obj:setCounterClass. obj.id == id
  }

pros

  • 簡単 cons
  • ID生成方法によっては衝突する(他のIDの状態が分からない)
  1. RepにID要素を追加しそこに放り込む。こちらもコンストラクタで処理する感じ

e.g.)

SetCounterRep = { ... id: Num }
setCounterClass = 
  \r: SetCounterRep. \self: Source SetCounter.
  r.id = (何かしらのID生成) ; 
  {
    ...
    sameObject = \obj:setCounterClass. obj.id == r.id
  }

pros

  • cloneが簡単 cons
  • こちらも衝突しうる