6.10. kink/DYN

6.10.1. dyn型

dynはコールスタック上にプッシュ、ポップされる値のタグである。

「dyn」という名前は「dynamic scope」から来ている。これはdynが、いくつかのLisp方言における動的スコープ変数のようにふるまうからだ。

dynは実行時文脈を持ち回るのに使える。たとえば、トランザクションを持ち回れる。次の例を見よ:

:DYN.require_from('kink/')

:Tx_dyn <- DYN.new

:do_transaction <- {(:Tx_name :thunk)
  Tx_dyn.with(Tx_name){
    thunk
  }
}

:commit <- {()
  :Current_tx = Tx_dyn.top
  stdout.print_line('commit {}'.format(Current_tx))
}

do_transaction('Outer'){
  commit # => commit Outer
  do_transaction('Inner'){
    commit # => commit Inner
  }
  commit # => commit Outer
}

6.10.1.1. Dyn.with(Val $thunk)

withはValを、Dynにひもづけてコールスタックにプッシュして、$thunkを引数なしで呼び出す。$thunkの呼び出しが終わると、Valはコールスタックからポップされる。

事前条件

$thunkはサンクでなければならない。

6.10.1.2. Dyn.all

allはDynにひもづけられた値をvecとして戻す。要素は、コールスタックの底からトップへと並べられる。

:DYN.require_from('kink/')

:Dyn <- DYN.new

Dyn.with('foo'){
  Dyn.with('bar'){
    Dyn.with('baz'){
      stdout.print_line(Dyn.all.repr) # => ["foo" "bar" "baz"]
    }
    stdout.print_line(Dyn.all.repr) # => ["foo" "bar"]
  }
  stdout.print_line(Dyn.all.repr) # => ["foo"]
}
stdout.print_line(Dyn.all.repr) # => []

6.10.1.3. Dyn.top

topはDynにひもづけられた値のうち、コールスタック上で最もtopに近い値を戻す。

事前条件

少なくともひとつの値がコールスタック上でDynにひもづけられていなければならない。

:DYN.require_from('kink/')

:Dyn <- DYN.new

Dyn.with('foo'){
  stdout.print_line(Dyn.top.repr) # => "foo"
}
Dyn.top # => raises an exception

6.10.1.4. Dyn.any?

any?は、コールスタック上で、Dynに何らかの値がひもづけられているかどうかを戻す。

:DYN.require_from('kink/')

:Dyn <- DYN.new

Dyn.with('foo'){
  stdout.print_line(Dyn.any?.repr) # => true
}
stdout.print_line(Dyn.any?.repr) # => false

6.10.2. DYN.new

newは新しいdynを戻す。

6.10.3. DYN.is?(Val)

is?はValがdynであるかどうかを戻す。