DSL для хранения ресурсов

Может ли кто-нибудь помочь мне создать DSL для хранения ресурсов? Я хочу использовать его аналогично synchronized в Java, чтобы, если ресурс (java: монитор объекта) уже был получен, он не был получен снова! (Для следующего примера предполагается, что ресурсы имеют тип Int)

object Holding {
  def main(args : Array[String]) : Unit = {

    HoldResource(1,2,3) {
      // holding resource 1,2,3
      println("!")
      HoldResource(3) {
        // still holding resource 1,2,3 (but not acquiring resource 3 again!!!)
        println("*")
      }
      println("!!")
      HoldResource(4,5) {
        // holding resource 1,2,3,4,5
        println("#")
      }
      println("!!!")
    }
    // all resources are freed
  }
}

До сих пор мой ГРУБЫЙ подход выглядит так (это означает, что я знаю о шаблоне ресурсов try { ... } finally { ... }):

object HoldResource {
  class Context(val resources: Seq[Int]) {
    def apply[A](f: => A): A = {
      try { f } finally {
        // free resources
      }
    }
  }
  def apply[A](resources: Int*): Context = {
    // lock/acquire resources
    new Context(resources)
  }
}

Большое спасибо!


person Peter Schmitz    schedule 18.01.2011    source источник
comment
Вам действительно нужен доменный язык для того, что вы хотите, или просто одна конструкция, которая делает то, что вам нужно?   -  person Rex Kerr    schedule 18.01.2011
comment
Хорошо, возможно, мое понимание DSL несколько отличается. Достаточно конструкции, которая выполняет эту работу.   -  person Peter Schmitz    schedule 18.01.2011


Ответы (1)


Похоже, вам нужна транзакционная память программного обеспечения.

Попробуйте эти статьи, чтобы начать:

Также есть несколько полезных материалов по управлению ресурсами:

person Kevin Wright    schedule 18.01.2011