6.80. kink/program/PROGRAM¶
6.80.1. program型¶
programは、プログラム名とプログラムテキストの対である。
6.80.1.1. P.name¶
nameは、プログラム名をstrとして戻す。
6.80.1.2. P.text¶
textは、プログラムテキストをstrとして戻す。
6.80.1.3. P.compile(...[$config={}])¶
compileは、Pを関数にコンパイルする。
コンフィグメソッド:
• C.binding(Binding): default = BINDING.new
• C.locale(Locale): default = LOCALE.root
• C.on_success($success): default = VAL$identity
• C.on_error($error): default = 例外を投げる関数
プログラムが関数にコンパイルされた場合、compileは、その関数を渡して$successを末尾呼び出しする。
コンパイルエラーが起きた場合、compileは、compile_errorを渡して$errorを末尾呼び出しする。compile_errorの持つlocation値のProgram属性はPに等しくなる。
コンパイル
プログラムテキストは、マニュアルの「言語仕様」の章に規定されているとおり、抽象命令の列に変換される。
ついで、列の中のすべての (binding) 命令は、 (val Binding) に置き換えられる。この置換は、一番外側の列に対してのみ行われ、ネストされた列に対しては行われない。
結果の関数は、置換を経た抽象命令の列を持つ。
事前条件
Bindingはbindingでなければならない。
Localeはlocaleでなければならない。
$successは、関数を取る関数でなければならない。
$errorは、compile_errorを取る関数でなければならない。
例
:BINDING.require_from('kink/')
:LOCALE.require_from('kink/')
:PROGRAM.require_from('kink/program/')
:P <- PROGRAM.new('add.kn' '10 + 20')
:fun <- P.compile{(:C)
C.locale(LOCALE.for('ja-JP'))
C.on_error{(:Err)
raise('unexpected compile error: {}'.format(Err.desc))
}
}
:R <- fun
stdout.print_line(R.repr) # => 30
6.80.1.4. P1 == P2¶
== 演算子、つまりop_eqメソッドは、P1とP2が同値のプログラム名とプログラムテキストを持っているかどうかを戻す。
事前条件
P2はprogramでなければならない。
6.80.2. PROGRAM.new(Name Text)¶
newは、Nameをプログラム名として、Textをプログラムテキストとして、新しいprogramを戻す。
事前条件
Nameはstrでなければならない。
Textはstrでなければならない。
6.80.3. PROGRAM.is?(Val)¶
is?は、Valがprogramであるかどうかを戻す。