mirror of
https://github.com/janet-lang/janet
synced 2024-11-25 09:47:17 +00:00
Merge branch 'master' into net
This commit is contained in:
commit
8ae6ae65a1
@ -1583,14 +1583,16 @@
|
|||||||
ret)
|
ret)
|
||||||
|
|
||||||
(defn all
|
(defn all
|
||||||
"Returns true if all xs are truthy, otherwise the first false or nil value."
|
"Returns true if all xs are truthy, otherwise the resulty of first
|
||||||
|
falsey predicate value, (pred x)."
|
||||||
[pred xs]
|
[pred xs]
|
||||||
(var ret true)
|
(var ret true)
|
||||||
(loop [x :in xs :while ret] (set ret (pred x)))
|
(loop [x :in xs :while ret] (set ret (pred x)))
|
||||||
ret)
|
ret)
|
||||||
|
|
||||||
(defn some
|
(defn some
|
||||||
"Returns nil if all xs are false or nil, otherwise returns the first true value."
|
"Returns nil if all xs are false or nil, otherwise returns the result of the
|
||||||
|
first truthy predicate, (pred x)."
|
||||||
[pred xs]
|
[pred xs]
|
||||||
(var ret nil)
|
(var ret nil)
|
||||||
(loop [x :in xs :while (not ret)] (if-let [y (pred x)] (set ret y)))
|
(loop [x :in xs :while (not ret)] (if-let [y (pred x)] (set ret y)))
|
||||||
|
@ -28,6 +28,11 @@
|
|||||||
#include "vector.h"
|
#include "vector.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static int arity1or2(JanetFopts opts, JanetSlot *args) {
|
||||||
|
(void) opts;
|
||||||
|
int32_t arity = janet_v_count(args);
|
||||||
|
return arity == 1 || arity == 2;
|
||||||
|
}
|
||||||
static int fixarity1(JanetFopts opts, JanetSlot *args) {
|
static int fixarity1(JanetFopts opts, JanetSlot *args) {
|
||||||
(void) opts;
|
(void) opts;
|
||||||
return janet_v_count(args) == 1;
|
return janet_v_count(args) == 1;
|
||||||
@ -63,6 +68,27 @@ static JanetSlot genericSSI(JanetFopts opts, int op, JanetSlot s, int32_t imm) {
|
|||||||
return target;
|
return target;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Emit an insruction that implements a form by itself. */
|
||||||
|
static JanetSlot opfunction(
|
||||||
|
JanetFopts opts,
|
||||||
|
JanetSlot *args,
|
||||||
|
int op,
|
||||||
|
Janet defaultArg2) {
|
||||||
|
JanetCompiler *c = opts.compiler;
|
||||||
|
int32_t len;
|
||||||
|
len = janet_v_count(args);
|
||||||
|
JanetSlot t;
|
||||||
|
if (len == 1) {
|
||||||
|
t = janetc_gettarget(opts);
|
||||||
|
janetc_emit_sss(c, op, t, args[0], janetc_cslot(defaultArg2), 1);
|
||||||
|
return t;
|
||||||
|
} else if (len == 2) {
|
||||||
|
t = janetc_gettarget(opts);
|
||||||
|
janetc_emit_sss(c, op, t, args[0], args[1], 1);
|
||||||
|
}
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
|
||||||
/* Emit a series of instructions instead of a function call to a math op */
|
/* Emit a series of instructions instead of a function call to a math op */
|
||||||
static JanetSlot opreduce(
|
static JanetSlot opreduce(
|
||||||
JanetFopts opts,
|
JanetFopts opts,
|
||||||
@ -113,7 +139,7 @@ static JanetSlot do_get(JanetFopts opts, JanetSlot *args) {
|
|||||||
return opreduce(opts, args, JOP_GET, janet_wrap_nil());
|
return opreduce(opts, args, JOP_GET, janet_wrap_nil());
|
||||||
}
|
}
|
||||||
static JanetSlot do_next(JanetFopts opts, JanetSlot *args) {
|
static JanetSlot do_next(JanetFopts opts, JanetSlot *args) {
|
||||||
return opreduce(opts, args, JOP_NEXT, janet_wrap_nil());
|
return opfunction(opts, args, JOP_NEXT, janet_wrap_nil());
|
||||||
}
|
}
|
||||||
static JanetSlot do_modulo(JanetFopts opts, JanetSlot *args) {
|
static JanetSlot do_modulo(JanetFopts opts, JanetSlot *args) {
|
||||||
return opreduce(opts, args, JOP_MODULO, janet_wrap_nil());
|
return opreduce(opts, args, JOP_MODULO, janet_wrap_nil());
|
||||||
@ -143,7 +169,7 @@ static JanetSlot do_yield(JanetFopts opts, JanetSlot *args) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
static JanetSlot do_resume(JanetFopts opts, JanetSlot *args) {
|
static JanetSlot do_resume(JanetFopts opts, JanetSlot *args) {
|
||||||
return opreduce(opts, args, JOP_RESUME, janet_wrap_nil());
|
return opfunction(opts, args, JOP_RESUME, janet_wrap_nil());
|
||||||
}
|
}
|
||||||
static JanetSlot do_apply(JanetFopts opts, JanetSlot *args) {
|
static JanetSlot do_apply(JanetFopts opts, JanetSlot *args) {
|
||||||
/* Push phase */
|
/* Push phase */
|
||||||
@ -270,7 +296,7 @@ static const JanetFunOptimizer optimizers[] = {
|
|||||||
{fixarity1, do_error},
|
{fixarity1, do_error},
|
||||||
{minarity2, do_apply},
|
{minarity2, do_apply},
|
||||||
{maxarity1, do_yield},
|
{maxarity1, do_yield},
|
||||||
{fixarity2, do_resume},
|
{arity1or2, do_resume},
|
||||||
{fixarity2, do_in},
|
{fixarity2, do_in},
|
||||||
{fixarity3, do_put},
|
{fixarity3, do_put},
|
||||||
{fixarity1, do_length},
|
{fixarity1, do_length},
|
||||||
@ -293,7 +319,7 @@ static const JanetFunOptimizer optimizers[] = {
|
|||||||
{NULL, do_neq},
|
{NULL, do_neq},
|
||||||
{fixarity2, do_propagate},
|
{fixarity2, do_propagate},
|
||||||
{fixarity2, do_get},
|
{fixarity2, do_get},
|
||||||
{fixarity2, do_next},
|
{arity1or2, do_next},
|
||||||
{fixarity2, do_modulo},
|
{fixarity2, do_modulo},
|
||||||
{fixarity2, do_remainder},
|
{fixarity2, do_remainder},
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user