SYNOPSIS
        #include <compile_string.h>

        closure compile_string(symbol* args, string str)
        closure compile_string(symbol* args, string str
                              , struct compile_string_options opts)
        closure compile_string(symbol* args, string &str
                              , struct compile_string_options opts)

DESCRIPTION
        Compiles <str> into a closure. The closure will be bound to the
        current object. By default the string will be interpreted as an
        LPC expression. The string may also contain preprocessor directives
        (which must occur on their own line).

        The argument names are given as the first argument <args>.

        Optionally the function accepts a struct with additional options.
        All entries in this struct are optional. These are the members:

          functions:
          variables:
          structs:
              A mapping or closure for the lookup of functions, variables,
              resp. structs during compilation. A mapping is looked up using
              the name, the closure will be called with the name as its only
              argument. The name of the function, variable, resp. struct will
              be given as a symbol. The result (mapping value resp. closure
              return value) should be:
                - for <functions> a closure,
                - for <variables> a reference, and
                - for <structs> a template struct (i.e. a struct whose data
                  is irrelevant, only its type will be used).

          use_object_functions:
          use_object_variables:
          use_object_structs:
              If set (integer != 0) the compiled code may reference the
              current object's functions, variables, resp. structs. However
              successful lookups in <variables>, <functions>, resp. <structs>
              have precedence. Private variables, functions and structs
              cannot be accessed this way.

          compile_expression:
              If set (integer != 0) the string is interpreted as an expression
              (eg. "1+1") and therefore must not contain a terminal semicolon.
              If no compile mode is selected, this is the default.

          compile_block:
              If set (integer != 0) the string is interpreted as a block (code
              between braces), the surrounding braces can be omitted. To return
              a value, the code needs a return statement.

          as_async:
              If set (integer != 0) the code will be compiled as a coroutine,
              i.e. the resulting closure will return a coroutine when called.

          detect_end:
              If set (integer != 0) the driver will try(!) to detect the end
              of the expression/block and return the remaining string in <str>
              (<str> needs to be passed as a reference for this).
              An end is detected if the word or character following a full
              expression or block is not suitable to continue the expression
              or block. Also a comma will end an expression.

        When compiling expressions the result of the H_AUTO_INCLUDE_EXPRESSION
        driver hook will be prepended, for blocks the H_AUTO_INCLUDE_BLOCK
        hook will be used.

EXAMPLES
        funcall(compile_string(({'a,'b}), "a+b"), 1, 2);

HISTORY
        Introduced in LDMud 3.6.7.

SEE ALSO
        compile_string_options(S), lambda(E), block(LPC),
        auto_include_expression(H), auto_include_block(H)
