mirror of
https://github.com/janet-lang/janet
synced 2025-10-24 04:07:41 +00:00
Quasiquoting bracketed tuples.
This commit is contained in:
@@ -101,6 +101,7 @@ static const JanetInstructionDef janet_ops[] = {
|
|||||||
{"ltim", JOP_LESS_THAN_IMMEDIATE},
|
{"ltim", JOP_LESS_THAN_IMMEDIATE},
|
||||||
{"ltn", JOP_NUMERIC_LESS_THAN},
|
{"ltn", JOP_NUMERIC_LESS_THAN},
|
||||||
{"mkarr", JOP_MAKE_ARRAY},
|
{"mkarr", JOP_MAKE_ARRAY},
|
||||||
|
{"mkbtp", JOP_MAKE_BRACKET_TUPLE},
|
||||||
{"mkbuf", JOP_MAKE_BUFFER},
|
{"mkbuf", JOP_MAKE_BUFFER},
|
||||||
{"mkstr", JOP_MAKE_STRING},
|
{"mkstr", JOP_MAKE_STRING},
|
||||||
{"mkstu", JOP_MAKE_STRUCT},
|
{"mkstu", JOP_MAKE_STRUCT},
|
||||||
|
|||||||
@@ -85,10 +85,11 @@ enum JanetInstructionType janet_instructions[JOP_INSTRUCTION_COUNT] = {
|
|||||||
JINT_SS, /* JOP_LENGTH */
|
JINT_SS, /* JOP_LENGTH */
|
||||||
JINT_S, /* JOP_MAKE_ARRAY */
|
JINT_S, /* JOP_MAKE_ARRAY */
|
||||||
JINT_S, /* JOP_MAKE_BUFFER */
|
JINT_S, /* JOP_MAKE_BUFFER */
|
||||||
JINT_S, /* JOP_MAKE_TUPLE */
|
JINT_S, /* JOP_MAKE_STRING */
|
||||||
JINT_S, /* JOP_MAKE_STRUCT */
|
JINT_S, /* JOP_MAKE_STRUCT */
|
||||||
JINT_S, /* JOP_MAKE_TABLE */
|
JINT_S, /* JOP_MAKE_TABLE */
|
||||||
JINT_S, /* JOP_MAKE_STRING */
|
JINT_S, /* JOP_MAKE_TUPLE */
|
||||||
|
JINT_S, /* JOP_MAKE_BRACKET_TUPLE */
|
||||||
JINT_SSS, /* JOP_NUMERIC_LESS_THAN */
|
JINT_SSS, /* JOP_NUMERIC_LESS_THAN */
|
||||||
JINT_SSS, /* JOP_NUMERIC_LESS_THAN_EQUAL */
|
JINT_SSS, /* JOP_NUMERIC_LESS_THAN_EQUAL */
|
||||||
JINT_SSS, /* JOP_NUMERIC_GREATER_THAN */
|
JINT_SSS, /* JOP_NUMERIC_GREATER_THAN */
|
||||||
|
|||||||
@@ -499,7 +499,7 @@ static Janet os_dir(int32_t argc, Janet *argv) {
|
|||||||
char pattern[MAX_PATH + 1];
|
char pattern[MAX_PATH + 1];
|
||||||
if (strlen(dir) > (sizeof(pattern) - 3))
|
if (strlen(dir) > (sizeof(pattern) - 3))
|
||||||
janet_panicf("path too long: %s", dir);
|
janet_panicf("path too long: %s", dir);
|
||||||
sprintf(pattern, "%s/*", dir);
|
sprintf(pattern, "%s/*", dir);
|
||||||
intptr_t res = _findfirst(pattern, &afile);
|
intptr_t res = _findfirst(pattern, &afile);
|
||||||
if (-1 == res) janet_panicv(janet_cstringv(strerror(errno)));
|
if (-1 == res) janet_panicv(janet_cstringv(strerror(errno)));
|
||||||
do {
|
do {
|
||||||
|
|||||||
@@ -71,7 +71,9 @@ static JanetSlot quasiquote(JanetFopts opts, Janet x) {
|
|||||||
}
|
}
|
||||||
for (i = 0; i < len; i++)
|
for (i = 0; i < len; i++)
|
||||||
janet_v_push(slots, quasiquote(opts, tup[i]));
|
janet_v_push(slots, quasiquote(opts, tup[i]));
|
||||||
return qq_slots(opts, slots, JOP_MAKE_TUPLE);
|
return qq_slots(opts, slots, (janet_tuple_flag(tup) & JANET_TUPLE_FLAG_BRACKETCTOR)
|
||||||
|
? JOP_MAKE_BRACKET_TUPLE
|
||||||
|
: JOP_MAKE_TUPLE);
|
||||||
}
|
}
|
||||||
case JANET_ARRAY: {
|
case JANET_ARRAY: {
|
||||||
int32_t i;
|
int32_t i;
|
||||||
|
|||||||
@@ -126,6 +126,7 @@ static void *op_lookup[255] = {
|
|||||||
&&label_JOP_MAKE_STRUCT,
|
&&label_JOP_MAKE_STRUCT,
|
||||||
&&label_JOP_MAKE_TABLE,
|
&&label_JOP_MAKE_TABLE,
|
||||||
&&label_JOP_MAKE_TUPLE,
|
&&label_JOP_MAKE_TUPLE,
|
||||||
|
&&label_JOP_MAKE_BRACKET_TUPLE,
|
||||||
&&label_JOP_NUMERIC_LESS_THAN,
|
&&label_JOP_NUMERIC_LESS_THAN,
|
||||||
&&label_JOP_NUMERIC_LESS_THAN_EQUAL,
|
&&label_JOP_NUMERIC_LESS_THAN_EQUAL,
|
||||||
&&label_JOP_NUMERIC_GREATER_THAN,
|
&&label_JOP_NUMERIC_GREATER_THAN,
|
||||||
@@ -681,10 +682,15 @@ static JanetSignal run_vm(JanetFiber *fiber, Janet in, JanetFiberStatus status)
|
|||||||
vm_checkgc_pcnext();
|
vm_checkgc_pcnext();
|
||||||
}
|
}
|
||||||
|
|
||||||
VM_OP(JOP_MAKE_TUPLE) {
|
VM_OP(JOP_MAKE_TUPLE)
|
||||||
|
/* fallthrough */
|
||||||
|
VM_OP(JOP_MAKE_BRACKET_TUPLE) {
|
||||||
int32_t count = fiber->stacktop - fiber->stackstart;
|
int32_t count = fiber->stacktop - fiber->stackstart;
|
||||||
Janet *mem = fiber->data + fiber->stackstart;
|
Janet *mem = fiber->data + fiber->stackstart;
|
||||||
stack[D] = janet_wrap_tuple(janet_tuple_n(mem, count));
|
const Janet *tup = janet_tuple_n(mem, count);
|
||||||
|
if (opcode == JOP_MAKE_BRACKET_TUPLE)
|
||||||
|
janet_tuple_flag(tup) |= JANET_TUPLE_FLAG_BRACKETCTOR;
|
||||||
|
stack[D] = janet_wrap_tuple(tup);
|
||||||
fiber->stacktop = fiber->stackstart;
|
fiber->stacktop = fiber->stackstart;
|
||||||
vm_checkgc_pcnext();
|
vm_checkgc_pcnext();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -970,6 +970,7 @@ enum JanetOpCode {
|
|||||||
JOP_MAKE_STRUCT,
|
JOP_MAKE_STRUCT,
|
||||||
JOP_MAKE_TABLE,
|
JOP_MAKE_TABLE,
|
||||||
JOP_MAKE_TUPLE,
|
JOP_MAKE_TUPLE,
|
||||||
|
JOP_MAKE_BRACKET_TUPLE,
|
||||||
JOP_NUMERIC_LESS_THAN,
|
JOP_NUMERIC_LESS_THAN,
|
||||||
JOP_NUMERIC_LESS_THAN_EQUAL,
|
JOP_NUMERIC_LESS_THAN_EQUAL,
|
||||||
JOP_NUMERIC_GREATER_THAN,
|
JOP_NUMERIC_GREATER_THAN,
|
||||||
|
|||||||
@@ -88,4 +88,7 @@
|
|||||||
(assert (deep= (drop-until pos? @[-1 -2 3]) @[3]) "drop-until 4")
|
(assert (deep= (drop-until pos? @[-1 -2 3]) @[3]) "drop-until 4")
|
||||||
(assert (deep= (drop-until pos? @[-1 1 -2]) @[1 -2]) "drop-until 5")
|
(assert (deep= (drop-until pos? @[-1 1 -2]) @[1 -2]) "drop-until 5")
|
||||||
|
|
||||||
|
# Quasiquote bracketed tuples
|
||||||
|
(assert (= (tuple/type ~[1 2 3]) (tuple/type '[1 2 3])) "quasiquote bracket tuples")
|
||||||
|
|
||||||
(end-suite)
|
(end-suite)
|
||||||
|
|||||||
Reference in New Issue
Block a user