Created
September 25, 2026 00:52
-
-
Save klange/9b2b6d2f0d2ce67171a2573c5fd043c0 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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