瀏覽代碼

Add name to Function struct to print them nicely

pull/8/head
mtardy 4 年之前
父節點
當前提交
fafec91e1e
共有 2 個檔案被更改,包括 16 行新增10 行删除
  1. +9
    -3
      object.c
  2. +7
    -7
      parse.leg

+ 9
- 3
object.c 查看文件

@ -91,6 +91,7 @@ typedef oop (*primitive_t)(oop params);
struct Function {
type_t type;
primitive_t primitive;
char *name;
oop body;
oop param;
oop parentScope;
@ -158,7 +159,7 @@ oop _checkType(oop ptr, type_t type, char *file, int line)
return ptr;
}
// added parens around expansion to protect assignment
// added parens around e/makexpansion to protect assignment
#define get(PTR, TYPE, FIELD) (_checkType(PTR, TYPE, __FILE__, __LINE__)->TYPE.FIELD)
#define set(PTR, TYPE, FIELD, VALUE) (_checkType(PTR, TYPE, __FILE__, __LINE__)->TYPE.FIELD = VALUE)
@ -218,11 +219,12 @@ oop makeSymbol(char *name)
return newSymb;
}
oop makeFunction(primitive_t primitive, oop param, oop body, oop parentScope)
oop makeFunction(primitive_t primitive, char * name, oop param, oop body, oop parentScope)
{
oop newFunc = memcheck(malloc(sizeof(union object)));
newFunc->type = Function;
newFunc->Function.primitive = primitive;
newFunc->Function.name = memcheck(strdup(name));
newFunc->Function.param = param;
newFunc->Function.body = body;
newFunc->Function.parentScope = parentScope;
@ -464,7 +466,11 @@ void print(oop ast)
printf("%s", get(ast, Symbol, name));
return;
case Function:
printf("Function@%p", get(ast, Function, primitive));
if (get(ast, Function, primitive) == NULL) {
printf("Function:%s", get(ast, Function, name));
} else {
printf("Primitive:%s@%p", get(ast, Function, name), get(ast, Function, primitive));
}
return;
case Map:
map_print(ast, 0);

+ 7
- 7
parse.leg 查看文件

@ -1084,7 +1084,7 @@ oop eval(oop scope, oop ast)
oop name = map_get(ast, name_symbol);
oop param = map_get(ast, param_symbol);
oop body = map_get(ast, body_symbol);
oop func = makeFunction(NULL, param, body, scope);
oop func = makeFunction(NULL, get(name, Symbol, name), param, body, scope);
if (opt_v) {
printf("funcscope: ");
println(scope);
@ -1558,12 +1558,12 @@ int main(int argc, char **argv)
symbol_table = makeMap();
globals = makeMap();
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("clone") , makeFunction(prim_clone, null, null, globals));
map_set(globals, intern("exit") , makeFunction(prim_exit, "exit", null, null, globals));
map_set(globals, intern("keys") , makeFunction(prim_keys, "keys", null, null, globals));
map_set(globals, intern("length"), makeFunction(prim_length, "length", null, null, globals));
map_set(globals, intern("print") , makeFunction(prim_print, "print", null, null, globals));
map_set(globals, intern("invoke"), makeFunction(prim_invoke, "invoke", null, null, globals));
map_set(globals, intern("clone") , makeFunction(prim_clone, "clone", null, null, globals));
#define _DO(NAME) NAME##_symbol=intern(#NAME);
DO_SYMBOLS()

Loading…
取消
儲存