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であるかどうかを戻す。