Merge pull request #65 from xSavitar/attr-range-start-end

Add support for `.start` and `.end` attributes on Range objects
This commit is contained in:
Thakee Nathees 2021-06-13 22:08:00 +05:30
commit e90763c878
3 changed files with 22 additions and 3 deletions

View File

@ -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;

View File

@ -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)

View File

@ -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