瀏覽代碼

Fix 'not' operator and add primitives keys and length

pull/7/head
mtardy 4 年之前
父節點
當前提交
0b35fd3794
共有 1 個檔案被更改,包括 37 行新增10 行删除
  1. +37
    -10
      parse.leg

+ 37
- 10
parse.leg 查看文件

@ -1318,12 +1318,15 @@ oop eval(oop scope, oop ast)
BINARY(div, / ); BINARY(div, / );
BINARY(mod, % ); BINARY(mod, % );
# undef BINARY # undef BINARY
case t_not: {
oop rhs = eval(scope, map_get(ast, rhs_symbol));
return makeInteger(isFalse(rhs));
}
# define UNARY(NAME, OPERATOR) \ # define UNARY(NAME, OPERATOR) \
case t_##NAME: { \ case t_##NAME: { \
oop rhs = eval(scope, map_get(ast, rhs_symbol)); \ oop rhs = eval(scope, map_get(ast, rhs_symbol)); \
return makeInteger(OPERATOR getInteger(rhs)); \ return makeInteger(OPERATOR getInteger(rhs)); \
} }
UNARY(not, !);
UNARY(neg, -); UNARY(neg, -);
UNARY(com, ~); UNARY(com, ~);
# undef UNARY # undef UNARY
@ -1424,18 +1427,40 @@ oop prim_exit(oop params)
{ {
int status= 0; int status= 0;
if (map_hasIntegerKey(params, 0)) { if (map_hasIntegerKey(params, 0)) {
oop arg= get(params, Map, elements)[0].value;
if (isInteger(arg)) status= getInteger(arg);
oop arg= get(params, Map, elements)[0].value;
if (isInteger(arg)) status= getInteger(arg);
} }
exit(status); exit(status);
} }
oop prim_keys(oop params)
{
if (map_hasIntegerKey(params, 0)) {
oop arg= get(params, Map, elements)[0].value;
if (is(Map, arg)) return map_keys(arg);
}
return null;
}
oop prim_length(oop params)
{
if (map_hasIntegerKey(params, 0)) {
oop arg= get(params, Map, elements)[0].value;
switch (getType(arg)) {
case String: return makeInteger(strlen(get(arg, String, value)));
case Symbol: return makeInteger(strlen(get(arg, Symbol, name)));
case Map: return makeInteger(map_size(arg));
default: break;
}
}
return null;
}
oop prim_invoke(oop params) oop prim_invoke(oop params)
{ {
oop scope= globals; if (map_hasIntegerKey(params, 0)) scope= get(params, Map, elements)[0].value;
oop this= null; if (map_hasIntegerKey(params, 1)) this= get(params, Map, elements)[1].value;
oop func= null; if (map_hasIntegerKey(params, 2)) func= get(params, Map, elements)[2].value;
oop args= null; if (map_hasIntegerKey(params, 3)) args= get(params, Map, elements)[3].value;
oop this= null; if (map_hasIntegerKey(params, 0)) this= get(params, Map, elements)[0].value;
oop func= null; if (map_hasIntegerKey(params, 1)) func= get(params, Map, elements)[1].value;
oop args= null; if (map_hasIntegerKey(params, 2)) args= get(params, Map, elements)[2].value;
if (!is(Function, func)) { if (!is(Function, func)) {
printf("cannot invoke "); printf("cannot invoke ");
println(func); println(func);
@ -1515,10 +1540,12 @@ int main(int argc, char **argv)
symbol_table = makeMap(); symbol_table = makeMap();
globals = makeMap(); globals = makeMap();
map_set(globals, intern("exit") , makeFunction(prim_exit, null, null, globals));
map_set(globals, intern("print"), makeFunction(prim_print, null, null, globals));
map_set(globals, intern("exit") , makeFunction(prim_exit, null, null, globals));
map_set(globals, intern("keys") , makeFunction(prim_keys, null, null, globals));
map_set(globals, intern("length"), makeFunction(prim_length, null, null, globals));
map_set(globals, intern("print") , makeFunction(prim_print, null, null, globals));
map_set(globals, intern("invoke"), makeFunction(prim_invoke, null, null, globals)); map_set(globals, intern("invoke"), makeFunction(prim_invoke, null, null, globals));
map_set(globals, intern("clone"), makeFunction(prim_clone, null, null, globals));
map_set(globals, intern("clone") , makeFunction(prim_clone, null, null, globals));
#define _DO(NAME) NAME##_symbol=intern(#NAME); #define _DO(NAME) NAME##_symbol=intern(#NAME);
DO_SYMBOLS() DO_SYMBOLS()

Loading…
取消
儲存