6.13. kink/KONT_TAG¶
タグ付き限定継続のshift/reset操作を提供する。
shift/resetの対を使うことで、継続が関数として抜き出せる。例:
:KONT_TAG.require_from('kink/')
:Tag <- KONT_TAG.new
:paren <- Tag.reset{
'(' + Tag.shift{(:k) $k } + ')'
}
stdout.print_line(paren('foo')) # => (foo)
stdout.print_line(paren('bar')) # => (bar)
shiftが呼ばれなければ、resetは$thunkの結果を戻す。
:KONT_TAG.require_from('kink/')
:Tag <- KONT_TAG.new
:R <- Tag.reset{ 42 }
stdout.print_line(R.repr) # => 42
kont_tagのメソッドは抽象命令列を使って説明される。抽象命令列と抽象スタックマシンについては「言語仕様」 → 「評価」の節を見よう。
6.13.1. kont_tag型¶
kont_tagは限定継続の区切りである。
6.13.1.1. Kont_tag.reset($thunk)¶
resetは、継続をKont_tagで区切る。
resetの末尾では、次の抽象命令列が評価される:
(val $thunk)
(nada)
(emptyvec)
(call call)
(val Kont_tag)
(delimit)
事前条件
$thunkはサンクでなければならない。
6.13.1.2. Kont_tag.shift($abort)¶
shiftはKont_tagで区切られた継続関数を作り、Kont_tagまで移動し、その継続関数を引数として$abortを呼び出す。
shiftの末尾では、次の抽象命令列が評価される:
(val $abort)
(val Kont_tag)
(kont)
(val Kont_tag)
(abort)
事前条件
Kont_tag.can_shift? == true
$abortは継続関数を採る関数でなければならない。
6.13.1.3. Kont_tag.can_shift?¶
can_shift?は、現在のスタックで、Kont_tagに対してshiftが呼び出せるかどうかを戻す。
can_shift?の末尾では、次の抽象命令列が評価される:
(val Kont_tag)
(canshift)
6.13.2. KONT_TAG.new¶
newは、新しいkont_tagを戻す。
6.13.3. KONT_TAG.is?(Val)¶
is?は、Valがkont_tagであるかどうかを戻す。