|
|
@ -1123,16 +1123,16 @@ oop GetArray_eval(oop exp, oop env) |
|
|
|
default: fatal("[]: %s is not indexable", storeString(obj, 0)); |
|
|
|
} |
|
|
|
} |
|
|
|
if (getType(ind) == Object) { |
|
|
|
switch (getType(obj)) { |
|
|
|
case String: { |
|
|
|
int start = integerValue(eval(Object_get(ind, sym_start), env), "[..]"); |
|
|
|
int end = integerValue(eval(Object_get(ind, sym_end ), env), "[..]"); |
|
|
|
oop slice = newStringLen(String_aref(obj, start), end - start); |
|
|
|
return slice; |
|
|
|
if (getType(ind) == Object && Object_get(ind, prop_name) == Object_get(pRange, prop_name)) { |
|
|
|
switch (getType(obj)) { |
|
|
|
case String: { |
|
|
|
int start = integerValue(eval(Object_get(ind, sym_start), env), "[..]"); |
|
|
|
int end = integerValue(eval(Object_get(ind, sym_end ), env), "[..]"); |
|
|
|
oop slice = newStringLen(String_aref(obj, start), end - start); |
|
|
|
return slice; |
|
|
|
} |
|
|
|
default: fatal("[]: %s is not range - indexable", storeString(obj, 0)); |
|
|
|
} |
|
|
|
default: fatal("[]: %s is not range - indexable", storeString(obj, 0)); |
|
|
|
} |
|
|
|
} |
|
|
|
if (!is(Object, obj)) fatal("[]: %s is not an object", storeString(obj, 0)); |
|
|
|
return Object_getLocal(obj, ind); |
|
|
@ -2384,6 +2384,22 @@ oop prim_eval(oop func, oop self, oop args, oop env) |
|
|
|
return result; |
|
|
|
} |
|
|
|
|
|
|
|
oop prim_intern(oop func, oop self, oop args, oop env) |
|
|
|
{ |
|
|
|
int argc = _get(args, Object,isize); |
|
|
|
oop *indexed = _get(args, Object,indexed); |
|
|
|
oop result = nil; |
|
|
|
|
|
|
|
if (argc != 1) { |
|
|
|
fatal("intern: invalid number of arguments"); |
|
|
|
} |
|
|
|
if (getType(indexed[0]) != String) { |
|
|
|
fatal("intern: argument is not of type String, got %s instead", getTypeName(indexed[0])); |
|
|
|
} |
|
|
|
|
|
|
|
return intern(_get(indexed[0], String, value)); |
|
|
|
} |
|
|
|
|
|
|
|
oop prim_print(oop func, oop self, oop args, oop env) |
|
|
|
{ |
|
|
|
int argc = _get(args, Object,isize); |
|
|
@ -2615,6 +2631,7 @@ int main(int argc, char **argv) |
|
|
|
_set(intern("chr" ), Symbol,value, newPrimitive(prim_chr)); |
|
|
|
_set(intern("readfile" ), Symbol,value, newPrimitive(prim_readfile)); |
|
|
|
_set(intern("exit" ), Symbol,value, newPrimitive(prim_exit)); |
|
|
|
_set(intern("intern" ), Symbol,value, newPrimitive(prim_intern)); |
|
|
|
|
|
|
|
Object_put(pObject, intern("new"), newPrimitive(prim_new )); |
|
|
|
Object_put(pObject, intern("push"), newPrimitive(prim_push )); |
|
|
|