diff --git a/lib/std/kxfunctional.kx b/lib/std/kxfunctional.kx index 444e9abd0..2fb896a12 100644 --- a/lib/std/kxfunctional.kx +++ b/lib/std/kxfunctional.kx @@ -114,4 +114,27 @@ _function _functional_enumerator(e) { }; } -Functional.enumerable = Functional.Enumerator.create = _functional_enumerator; +Functional.methodMissing = _function(_instance, method, ...a) { + Functional[method] = _function(...args) { + return _function(obj) { + return obj[method](...args); + }; + }; + return Functional[method](...a); +}; + +// The methods in Array such as `map` have to be assigned to this object +// because Array.map will have been called directly instead of this.map +// and methodMissing will not be called. +Array.keySet(Array).filter({ => Array[_1].isFunction }).each { &(method) + Functional[method] = _function(...args) { + return _function(obj) { + return obj[method](...args); + }; + }; +}; + +Functional.enumerable + = Functional.Enumerator.create + = _functional_enumerator + ; diff --git a/lib/std/kxstartup.kx b/lib/std/kxstartup.kx index 85a612fed..d727a25c0 100644 --- a/lib/std/kxstartup.kx +++ b/lib/std/kxstartup.kx @@ -22,6 +22,11 @@ var Xml, Net; Net = _import('kxnet'); SQLite = _import('kxsqlite'); Debugger = _import('kxdebugger'); + using kxsysutil; + using kxstring; + using kxarray; + using kxbinary; + using kxnumeric; using kxisolate; using kxexception; using kxsqlite; @@ -29,11 +34,6 @@ var Xml, Net; using kxnet; using kxenumerable; using kxfunctional; - using kxsysutil; - using kxstring; - using kxarray; - using kxbinary; - using kxnumeric; using kxfile; using kxgetopt; Zip.create = File._zipCreate; diff --git a/src/ast_gencode.c b/src/ast_gencode.c index c25222259..cc0b251ef 100644 --- a/src/ast_gencode.c +++ b/src/ast_gencode.c @@ -1150,7 +1150,7 @@ LOOP_HEAD:; KX_CANNOT_BE_LVALUE(node, "Key-vaule"); if (node->lhs->type == KXOP_SPREAD) { gencode_ast_hook(ctx, node->lhs->lhs, ana, 0); - kv_push(kx_code_t, get_block(module, ana->block)->code, ((kx_code_t){ FILELINE(ana), .op = KX_APPENDA }));\ + kv_push(kx_code_t, get_block(module, ana->block)->code, ((kx_code_t){ FILELINE(ana), .op = KX_APPENDA })); } else { gencode_ast_hook(ctx, node->lhs, ana, 0); kv_push(kx_code_t, get_block(module, ana->block)->code, ((kx_code_t){ FILELINE(ana), .op = KX_APPENDK, .value1 = { .s = const_str(ctx, node->value.s) } })); diff --git a/src/extlib/kxarray.c b/src/extlib/kxarray.c index 04d786633..a6a46fd3c 100644 --- a/src/extlib/kxarray.c +++ b/src/extlib/kxarray.c @@ -447,14 +447,8 @@ int Array_flatten(int args, kx_frm_t *frmv, kx_frm_t *lexv, kx_context_t *ctx) { kx_obj_t *obj = get_arg_obj(1, args, ctx); if (obj) { - int level = -1; kx_obj_t *ary = allocate_obj(ctx); - if (args > 1) { - kx_val_t val = kv_last_by(ctx->stack, 2); - if (val.type == KX_INT_T) { - level = get_arg_int(2, args, ctx); - } - } + int level = args > 1 ? get_arg_int(2, args, ctx) : -1; int r = Array_flatten_impl(args, ctx, ary, obj, 0, level); if (r > 0) { KX_ADJST_STACK(); diff --git a/src/ir_util.c b/src/ir_util.c index 800f40662..9be2e1112 100644 --- a/src/ir_util.c +++ b/src/ir_util.c @@ -6432,7 +6432,7 @@ void kx_try_spread(kx_context_t *ctx, kx_code_t *cur, kx_val_t *v1) kx_obj_t *obj = v1->value.ov; int len = kv_size(obj->ary); if (len == 0) { - push_undef((ctx)->stack); + ctx->spread_additional--; } else { ctx->spread_additional += --len; for (int i = len; i >= 0; --i) { @@ -6443,7 +6443,7 @@ void kx_try_spread(kx_context_t *ctx, kx_code_t *cur, kx_val_t *v1) kvec_t(uint8_t) *bin = &(v1->value.bn->bin); int len = kv_size(*bin); if (len == 0) { - push_undef((ctx)->stack); + ctx->spread_additional--; } else { ctx->spread_additional += --len; for (int i = len; i >= 0; --i) {