Skip to content

Instantly share code, notes, and snippets.

@klange
Created September 25, 2026 00:52
Show Gist options
  • Select an option

  • Save klange/9b2b6d2f0d2ce67171a2573c5fd043c0 to your computer and use it in GitHub Desktop.

Select an option

Save klange/9b2b6d2f0d2ce67171a2573c5fd043c0 to your computer and use it in GitHub Desktop.
diff --git a/src/compiler.c b/src/compiler.c
index 9705fc0..855084d 100644
--- a/src/compiler.c
+++ b/src/compiler.c
@@ -3567,6 +3567,16 @@ static void list(struct GlobalState * state, int exprType, RewindState *rewind)
/* Nested fun times */
state->parser.previous = syntheticToken("<listcomp>");
comprehensionExpression(state, scannerBefore, parserBefore, listInner, OP_MAKE_LIST);
+ } else if (match(TOKEN_ELLIPSIS)) {
+ expression(state);
+ if (match(TOKEN_RIGHT_SQUARE)) {
+ emitByte(OP_INRANGE);
+ } else {
+ consume(TOKEN_RIGHT_PAREN, "Expected ']' or ')' after range expression.");
+ emitByte(OP_EXRANGE);
+ }
+ stopEatingWhitespace();
+ return;
} else {
size_t argCount = 1;
while (match(TOKEN_COMMA) && !check(TOKEN_RIGHT_SQUARE)) {
diff --git a/src/kuroko/object.h b/src/kuroko/object.h
index 00f0259..63cdce8 100644
--- a/src/kuroko/object.h
+++ b/src/kuroko/object.h
@@ -266,6 +266,8 @@ typedef struct KrkClass {
KrkObj * _format;
KrkObj * _new;
KrkObj * _bool;
+ KrkObj * _inrange, * _rinrange;
+ KrkObj * _exrange, * _rexrange;
size_t cacheIndex;
} KrkClass;
diff --git a/src/methods.h b/src/methods.h
index 167af6e..e7a0897 100644
--- a/src/methods.h
+++ b/src/methods.h
@@ -70,3 +70,8 @@ SPECIAL_ATTRS(FUNC, "__func__")
SPECIAL_ATTRS(BLDCLS, "__build_class__")
SPECIAL_ATTRS(MAIN, "__main__")
SPECIAL_ATTRS(ALL, "__all__")
+
+CACHED_METHOD(INRANGE, "__inrange__", _inrange)
+CACHED_METHOD(RINRANGE, "__rinrange__", _rinrange)
+CACHED_METHOD(EXRANGE, "__exrange__", _exrange)
+CACHED_METHOD(REXRANGE, "__rexrange__", _rexrange)
diff --git a/src/obj_numeric.c b/src/obj_numeric.c
index cc6b4c3..2a6a702 100644
--- a/src/obj_numeric.c
+++ b/src/obj_numeric.c
@@ -595,6 +595,21 @@ KRK_Method(int,__pos__) {
return argv[0];
}
+KRK_Method(int,__inrange__) {
+ krk_push(OBJECT_VAL(KRK_BASE_CLASS(range)));
+ krk_push(argv[0]);
+ extern KrkValue krk_operator_add (KrkValue a, KrkValue b);
+ krk_push(krk_operator_add(argv[1], INTEGER_VAL(1)));
+ return krk_callStack(2);
+}
+
+KRK_Method(int,__exrange__) {
+ krk_push(OBJECT_VAL(KRK_BASE_CLASS(range)));
+ krk_push(argv[0]);
+ krk_push(argv[1]);
+ return krk_callStack(2);
+}
+
#undef CURRENT_CTYPE
#define CURRENT_CTYPE double
@@ -936,6 +951,8 @@ void _createAndBind_numericClasses(void) {
BIND_METHOD(int,__neg__);
BIND_METHOD(int,__abs__);
BIND_METHOD(int,__pos__);
+ BIND_METHOD(int,__inrange__);
+ BIND_METHOD(int,__exrange__);
krk_finalizeClass(_int);
KRK_DOC(_int, "Convert a number or string type to an integer representation.");
diff --git a/src/opcodes.h b/src/opcodes.h
index 88c3e3c..42d44dd 100644
--- a/src/opcodes.h
+++ b/src/opcodes.h
@@ -125,3 +125,6 @@ SIMPLE(OP_SWAP_POP)
COMPLICATED(OP_OVERLONG_JUMP,OVERLONG_JUMP_MORE)
SIMPLE(OP_PUSH_BUILD_CLASS)
SIMPLE(OP_IMPORT_STAR)
+
+SIMPLE(OP_INRANGE)
+SIMPLE(OP_EXRANGE)
diff --git a/src/vm.c b/src/vm.c
index 50fb27f..87269f1 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -1043,6 +1043,9 @@ MAKE_BIN_OP(truediv,"/",rtruediv)
MAKE_BIN_OP(floordiv,"//",rfloordiv)
MAKE_BIN_OP(matmul,"@",rmatmul)
+MAKE_COMPARE_OP(inrange,"]",rinrange)
+MAKE_COMPARE_OP(exrange,")",rexrange)
+
MAKE_COMPARE_OP(lt, "<", gt)
MAKE_COMPARE_OP(gt, ">", lt)
MAKE_COMPARE_OP(le, "<=", ge)
@@ -2341,6 +2344,8 @@ _finishReturn: (void)0;
case OP_NOT: krk_push(BOOLEAN_VAL(krk_isFalsey(krk_peek(0)))); /* fallthrough */
case OP_SWAP_POP: krk_swap(1); /* fallthrough */
case OP_POP: krk_pop(); break;
+ case OP_INRANGE: BINARY_OP(inrange);
+ case OP_EXRANGE: BINARY_OP(exrange);
case OP_INPLACE_ADD: INPLACE_BINARY_OP(add)
case OP_INPLACE_SUBTRACT: INPLACE_BINARY_OP(sub)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment