Version 5 (modified by tene, 5 years ago)

Add a comment

General Issues

* Until case mangling issues in Parrot are fixed, you must use an all-lowercase HLL name (someone plz add TT#) * Due to current bugs in Parrot, the 'load_language' opcode *must* be called from the 'parrot' HLL

Library Loading

To provide other languages access to libraries written in your language, you must add a 'load_library' method to your compiler object. This method must accept one positional parameter, a list (or ::-delimited string?) representing the name of the library to load, and an arbitrary quantity of other named parameters (:named :slurpy), which it is (currently) free to ignore. This method should return a hash containing the following attributes:

symbols:       # The only required attribute
    DEFAULT:
        # a map of names to symbols
    ALL:
        # a map of names to symbols
    # other named sets of symbols can go here...
    # the only required items are DEFAULT and ALL
# You can include other additional information
filename: "/path/to/filename.ext"
version: "v1.0.1"
author: "adent"

For existing implementations of this, look at runtime/parrot/languages/parrot/parrot.pir in the Parrot repository and perl6.pir in the rakudo repository.

An example implementation of a 'foreign_load' function:

.sub 'foreign_load'
    .param string lang
    .param string module
    .local pmc compiler, name, library, imports, callerns, foreignlibns
    $P0 = getinterp
    callerns = $P0['namespace';1]
    'load-language'(lang)          # This sub just calls the load_language opcode, but from the 'parrot' HLL, to avoid a parrot bug
    compiler = compreg lang
    name = split '::', module
    library = compiler.'load_library'(name)
    imports = library['symbols']
    imports = imports['DEFAULT']
    .local pmc iter, item
    iter = new 'Iterator', imports
  import_loop:
    unless iter goto import_loop_end
    $S0 = shift iter
    $P0 = imports[$S0]
    callerns[$S0] = $P0
    goto import_loop
  import_loop_end:
    foreignlibns = library['namespace']
    if null foreignlibns goto no_foreign_ns
    $S0 = pop name
    set_hll_global name, $S0, foreignlibns
  no_foreign_ns:
    .return (library)
.end