Ver a proveniência

Add GetIndex and SetIndex for strings

pull/11/head
mtardy há 4 anos
ascendente
cometimento
ab662a4b20
1 ficheiros alterados com 33 adições e 3 eliminações
  1. +33
    -3
      parse.leg

+ 33
- 3
parse.leg Ver ficheiro

@ -1387,15 +1387,45 @@ oop eval(oop scope, oop ast)
case t_GetIndex: {
oop map = eval(scope, map_get(ast, map_symbol));
oop key = eval(scope, map_get(ast, key_symbol));
return map_get(map, key);
switch (getType(map)) {
case String:
if (getInteger(key) >= get(map, String, size)) {
fprintf(stderr, "\nGetIndex out of range on String\n");
exit(1);
}
return makeInteger(unescape(get(map, String, value))[getInteger(key)]);
case Map:
return map_get(map, key);
default:
// should it returns null instead?
fprintf(stderr, "\nGetIndex on non Map or String\n");
exit(1);
}
}
case t_SetIndex: {
oop map = eval(scope, map_get(ast, map_symbol));
oop key = eval(scope, map_get(ast, key_symbol));
oop op = map_get(ast, operator_symbol);
oop value = eval(scope, map_get(ast, value_symbol));
if (null != op) value= applyOperator(op, map_get(map, key), value);
return map_set(map, key, value);
switch (getType(map)) {
case String:
if (getInteger(key) >= get(map, String, size)) {
fprintf(stderr, "\nSetIndex out of range on String\n");
exit(1);
}
get(map, String, value)[getInteger(key)] = getInteger(value);
return value;
case Map:
if (null != op) {
value= applyOperator(op, map_get(map, key), value);
}
return map_set(map, key, value);
default:
// should it returns null instead?
fprintf(stderr, "\nSetIndex on non Map or String\n");
exit(1);
}
}
# define SETINDEXOP(OPERATION, OPERATOR) \
case t_SetIndex##OPERATION: { \

Carregando…
Cancelar
Guardar