rm spreads and iterators

This commit is contained in:
2026-01-19 16:01:39 -06:00
parent 38a3697e28
commit 9b3891c126
5 changed files with 100 additions and 1960 deletions

View File

@@ -788,20 +788,22 @@ $_.clock(_ => {
var file_info = shop.file_info ? shop.file_info(locator.path) : null
var inject = shop.script_inject_for ? shop.script_inject_for(file_info) : []
// Build values array for injection
var vals = array(inject, key => {
if (key && key[0] == '$') key = text(key,1)
if (key == 'fd') return fd
return $_[key]
})
// Build env object for injection
var env = {}
for (var i = 0; i < length(inject); i++) {
var key = inject[i]
if (key && key[0] == '$') key = text(key, 1)
if (key == 'fd') env[key] = fd
else env[key] = $_[key]
}
// Create use function bound to the program's package
var pkg = file_info ? file_info.package : null
var use_fn = function(path) { return shop.use(path, pkg) }
// Call with signature: setup_module(args, use, ..capabilities)
// The script wrapper builds $_ from the injected capabilities for backward compatibility
var val = call(locator.symbol, null, _cell.args.arg, use_fn, ...vals)
// Call with signature: setup_module(args, use, env)
// The script wrapper binds $delay, $start, etc. from env
var val = call(locator.symbol, null, _cell.args.arg, use_fn, env)
if (val)
throw Error('Program must not return anything');

View File

@@ -376,17 +376,25 @@ Shop.get_script_capabilities = function(path) {
return Shop.script_inject_for(file_info)
}
function inject_params(inject) {
if (!inject || !length(inject)) return ''
return ', ' + text(inject, ', ')
function inject_env(inject) {
var env = {}
for (var i = 0; i < length(inject); i++) {
var inj = inject[i]
var key = trim(inj, '$')
if (key == 'fd') env[key] = fd
else env[key] = my$_[key]
}
return env
}
function inject_values(inject) {
return array(inject, function(inj) {
function inject_bindings_code(inject) {
var lines = []
for (var i = 0; i < length(inject); i++) {
var inj = inject[i]
var key = trim(inj, '$')
if (key == 'fd') return fd
return my$_[key]
})
lines.push(`var $${key} = env["${key}"];`)
}
return text(lines, '\n')
}
// Build the use function for a specific package context
@@ -397,9 +405,14 @@ function make_use_fn_code(pkg_arg) {
// for script forms, path is the canonical path of the module
var script_form = function(path, script, pkg, inject) {
var pkg_arg = pkg ? `'${pkg}'` : 'null'
var params = inject_params(inject)
var fn = `(function setup_module(args, use${params}){ def arg = args; def PACKAGE = ${pkg_arg}; ${script}})`
var binds = inject_bindings_code(inject)
var fn = `(function setup_module(args, use, env){
def arg = args;
def PACKAGE = ${pkg_arg};
${binds}
${script}
})`
return fn
}
@@ -791,13 +804,13 @@ function execute_module(info)
// Get file info to determine inject list
var file_info = Shop.file_info(mod_resolve.path)
var inject = Shop.script_inject_for(file_info)
var vals = inject_values(inject)
var env = inject_env(inject)
var pkg = file_info.package
var use_fn = make_use_fn(pkg)
// Call with signature: setup_module(args, use, ..capabilities)
// Call with signature: setup_module(args, use, env)
// args is null for module loading
used = call(mod_resolve.symbol, context, null, use_fn, ...vals)
used = call(mod_resolve.symbol, context, null, use_fn, env)
} else if (c_resolve.scope < 900) {
// C only
used = call_c_module(c_resolve)