|Version 5 (modified by tene, 6 years ago)|
* 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
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