4.19. kink/PROGRAM

Operations on kink programs.

4.19.1. PROGRAM.compile(Program_text ...[$config = {})]

`compile` compiles `Program_text` into a top level fun.

Preconditions:

• `Program_text` must be a str

• $config, if given, must be a fun which takes a conf val

The conf val provides the following methods:

• Conf.binding(Binding) : specifies `Binding` as the binding of the top level fun. If not called, a newly created binding is used.

• Conf.locale(Locale) : sets `Locale` as the locale used to create error messages. The default is LOCALE.root.

• Conf.name(Program_name) : uses `Program_name` as the name of the program. If the method is not called, "(compile)" is used as the default.

• Conf.on_success($success_cont): uses $success_cont as the success cont. If the method is not called, VAL.identity is used as the default.

• Conf.on_error($error_cont) : uses $error_cont as the error cont. If the method is not called, the default error cont raises an exception on an compile error.

Result:

• If the compilation succeeds, `compile` tail-calls the success cont with the compiled top level fun.

• If the compilation fails with a compile error, `compile` tail-calls the error cont with (Error_msg, Start_loc, End_loc), where Error_msg is the error message, Start_loc and End_loc are locs indicating the region of the compile error. The following condition holds: 0 <= Start_loc.pos <= End_loc.pos <= Program_text.size.

The top level fun is a fun which contains a sequence of instructions translated from the program, replacing every occurrence of `(binding)` by `(val Binding)`, where `Binding` is the binding of the top level fun.

See Language specification → Semantics about translation.

Example:

:PROGRAM.require_from('kink/')
:BINDING.require_from('kink/')
:LOCALE.require_from('kink/')
:fun <- PROGRAM.compile('10 + 20'){(:C)
  C.locale(LOCALE.for('ja-JP'))
  C.name('add.kn')
  C.on_error{(:Msg :Start_loc :End_loc)
    raise('unexpected compile error: {}'.format(Msg))
  }
}
stdout.print_line(fun(BINDING.new).repr)  # => 30

4.19.2. PROGRAM.compile_error_desc(Error_msg Start_loc End_loc)

compile_error_desc makes a typical description str of the compile error.

Parameters:

• Error_msg must be a message str.

• Start_loc must be the start loc of the compile error.

• End_loc must be the end loc of the compile error.

A typical result is: "compile error: unexpected token: [foo.kn L1 C6] 10 + -->+ 20"