diff --git a/parse.leg b/parse.leg index 668cb08..689670d 100644 --- a/parse.leg +++ b/parse.leg @@ -1897,6 +1897,71 @@ oop prim_String(oop scope, oop params) return makeString(printString(get(params, Map, elements)[0].value)); } +oop prim_Integer(oop scope, oop params) +{ + if (!map_hasIntegerKey(params, 0)) return null; + oop arg= get(params, Map, elements)[0].value; + switch (getType(arg)) { + case Undefined: { + return makeInteger(0); + } + case Integer: { + // does it make sense to copy an integer? + // return arg; + return makeInteger(getInteger(arg)); + } + case String: { + return makeInteger(strtoll(get(arg, String, value), NULL, 10)); + } + case Symbol: { + // since symbol are ident, they cannot start with a number so it's impossible that strtoll succeed + return makeInteger(strtoll(get(arg, Symbol, name), NULL, 10)); + } + } + return null; +} + +oop prim_Map(oop scope, oop params) +{ + if (!map_hasIntegerKey(params, 0)) return null; + oop arg= get(params, Map, elements)[0].value; + switch (getType(arg)) { + case Undefined: { + return makeMap(); + } + case Integer: { + oop map= makeMap(); + map_set(map, makeInteger(0), arg); + return map; + } + case Function: { + oop map= makeMap(); + map_set(map, get(arg, Function, name), arg); + return map; + } + case String: { + oop map= makeMap(); + size_t len= string_size(arg); + for(size_t i=0; i