diff --git a/src/pk_core.c b/src/pk_core.c index ff003d8..5644ee8 100644 --- a/src/pk_core.c +++ b/src/pk_core.c @@ -1318,9 +1318,19 @@ Var varGetAttrib(PKVM* vm, Var on, String* attrib) { Range* range = (Range*)obj; SWITCH_ATTRIB(attrib->data) { - CASE_ATTRIB("as_list", 0x1562c22) : + CASE_ATTRIB("as_list", 0x1562c22): return VAR_OBJ(rangeAsList(vm, range)); + // We can't use '.start', '.end' since 'end' in pocketlang is a + // keyword. Also we can't use '.from', '.to' since 'from' is a keyword + // too. So, we're using '.first' and '.last' to access the range limits. + + CASE_ATTRIB("first", 0x4881d841): + return VAR_NUM(range->from); + + CASE_ATTRIB("last", 0x63e1d819): + return VAR_NUM(range->to); + CASE_DEFAULT: ERR_NO_ATTRIB(vm, on, attrib); return VAR_NULL; @@ -1329,7 +1339,8 @@ Var varGetAttrib(PKVM* vm, Var on, String* attrib) { UNREACHABLE(); } - case OBJ_SCRIPT: { + case OBJ_SCRIPT: + { Script* scr = (Script*)obj; // Search in functions. @@ -1422,6 +1433,8 @@ do { \ case OBJ_RANGE: ATTRIB_IMMUTABLE("as_list"); + ATTRIB_IMMUTABLE("first"); + ATTRIB_IMMUTABLE("last"); ERR_NO_ATTRIB(vm, on, attrib); return; diff --git a/tests/lang/basics.pk b/tests/lang/basics.pk index 28a14ed..7c6a232 100644 --- a/tests/lang/basics.pk +++ b/tests/lang/basics.pk @@ -54,7 +54,7 @@ assert((1 << 0) == 1) assert((1 << 2) == 4) assert((3 << 2) == 12) -assert((1 >> 0) == 0) +assert((1 >> 1) == 0) assert((8 >> 1) == 4) assert((8 >> 2) == 2) assert((4 >> 2) == 1) diff --git a/tests/lang/core.pk b/tests/lang/core.pk index 5cae5d2..806e75a 100644 --- a/tests/lang/core.pk +++ b/tests/lang/core.pk @@ -29,6 +29,12 @@ def fn(p1, p2, p3) end assert(fn.name == "fn") assert(fn.arity == 3) +## range +r = 1..5 +assert(r.as_list == [1, 2, 3, 4]) +assert(r.first == 1) +assert(r.last == 5) + ## Math functions from math import PI, sin, cos, tan, abs