|
@ -3,7 +3,7 @@ |
|
|
# Copyright (c) 2016-2021 Ian Piumarta and other contributors (see AUTHORS) |
|
|
# Copyright (c) 2016-2021 Ian Piumarta and other contributors (see AUTHORS) |
|
|
# All rights reserved (see LICENSE) |
|
|
# All rights reserved (see LICENSE) |
|
|
# |
|
|
# |
|
|
# Last edited: 2023-03-22 16:55:04 by piumarta on zora-10.local |
|
|
|
|
|
|
|
|
# Last edited: 2023-03-22 17:00:49 by piumarta on zora-10.local |
|
|
|
|
|
|
|
|
%{ |
|
|
%{ |
|
|
/* compile: leg -o ccmeta.c ccmeta.leg |
|
|
/* compile: leg -o ccmeta.c ccmeta.leg |
|
@ -1294,6 +1294,55 @@ typedef enum { |
|
|
|
|
|
|
|
|
language lang = C, printLang = C; |
|
|
language lang = C, printLang = C; |
|
|
|
|
|
|
|
|
|
|
|
oop clone(oop obj) |
|
|
|
|
|
{ |
|
|
|
|
|
switch(getType(obj)) { |
|
|
|
|
|
case Undefined: |
|
|
|
|
|
case Integer: |
|
|
|
|
|
case Float: |
|
|
|
|
|
case Function: |
|
|
|
|
|
case Symbol: |
|
|
|
|
|
return obj; |
|
|
|
|
|
case String: |
|
|
|
|
|
return makeString(get(obj, String, value)); |
|
|
|
|
|
case Map: { |
|
|
|
|
|
struct Pair *elements= malloc(sizeof(struct Pair) * get(obj, Map, capacity)); |
|
|
|
|
|
memcpy(elements, get(obj, Map, elements), sizeof(struct Pair) * get(obj, Map, capacity)); |
|
|
|
|
|
oop map= malloc(sizeof(*obj)); |
|
|
|
|
|
memcpy(map, obj, sizeof(*obj)); |
|
|
|
|
|
set(map, Map, elements, elements); |
|
|
|
|
|
return map; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
return obj; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
oop treeCopy(oop obj) |
|
|
|
|
|
{ |
|
|
|
|
|
switch(getType(obj)) { |
|
|
|
|
|
case Undefined: |
|
|
|
|
|
case Integer: |
|
|
|
|
|
case Float: |
|
|
|
|
|
case Function: |
|
|
|
|
|
case Symbol: |
|
|
|
|
|
return obj; |
|
|
|
|
|
case String: |
|
|
|
|
|
return makeString(get(obj, String, value)); |
|
|
|
|
|
case Map: { |
|
|
|
|
|
struct Pair *elements= malloc(sizeof(struct Pair) * get(obj, Map, size)); |
|
|
|
|
|
memcpy(elements, get(obj, Map, elements), sizeof(struct Pair) * get(obj, Map, size)); |
|
|
|
|
|
oop map= malloc(sizeof(*obj)); |
|
|
|
|
|
memcpy(map, obj, sizeof(*obj)); |
|
|
|
|
|
for (int i = 0; i<get(obj, Map, size); i++) { |
|
|
|
|
|
elements[i].value = treeCopy(elements[i].value); |
|
|
|
|
|
} |
|
|
|
|
|
set(map, Map, elements, elements); |
|
|
|
|
|
return map; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
return obj; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
%} |
|
|
%} |
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -2517,29 +2566,6 @@ oop map_zip(oop map, oop keys, oop values) |
|
|
return map; |
|
|
return map; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
oop clone(oop obj) |
|
|
|
|
|
{ |
|
|
|
|
|
switch(getType(obj)) { |
|
|
|
|
|
case Undefined: |
|
|
|
|
|
case Integer: |
|
|
|
|
|
case Float: |
|
|
|
|
|
case Function: |
|
|
|
|
|
case Symbol: |
|
|
|
|
|
return obj; |
|
|
|
|
|
case String: |
|
|
|
|
|
return makeString(get(obj, String, value)); |
|
|
|
|
|
case Map: { |
|
|
|
|
|
struct Pair *elements= malloc(sizeof(struct Pair) * get(obj, Map, capacity)); |
|
|
|
|
|
memcpy(elements, get(obj, Map, elements), sizeof(struct Pair) * get(obj, Map, capacity)); |
|
|
|
|
|
oop map= malloc(sizeof(*obj)); |
|
|
|
|
|
memcpy(map, obj, sizeof(*obj)); |
|
|
|
|
|
set(map, Map, elements, elements); |
|
|
|
|
|
return map; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
return obj; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
struct Call |
|
|
struct Call |
|
|
{ |
|
|
{ |
|
|
oop ast, function; |
|
|
oop ast, function; |
|
@ -3472,6 +3498,12 @@ oop prim_clone(oop scope, oop params) |
|
|
return null; |
|
|
return null; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
oop prim_treeCopy(oop scope, oop params) |
|
|
|
|
|
{ |
|
|
|
|
|
if (map_hasIntegerKey(params, 0)) return treeCopy(get(params, Map, elements)[0].value); |
|
|
|
|
|
return null; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
oop prim_print(oop scope, oop params) |
|
|
oop prim_print(oop scope, oop params) |
|
|
{ |
|
|
{ |
|
|
assert(is(Map, params)); |
|
|
assert(is(Map, params)); |
|
@ -4608,6 +4640,7 @@ void init(void) |
|
|
map_set(globals, intern("invoke" ), makeFunction(prim_invoke, intern("invoke" ), null, null, globals, null)); |
|
|
map_set(globals, intern("invoke" ), makeFunction(prim_invoke, intern("invoke" ), null, null, globals, null)); |
|
|
map_set(globals, intern("apply" ), makeFunction(prim_apply, intern("apply" ), null, null, globals, null)); |
|
|
map_set(globals, intern("apply" ), makeFunction(prim_apply, intern("apply" ), null, null, globals, null)); |
|
|
map_set(globals, intern("clone" ), makeFunction(prim_clone, intern("clone" ), null, null, globals, null)); |
|
|
map_set(globals, intern("clone" ), makeFunction(prim_clone, intern("clone" ), null, null, globals, null)); |
|
|
|
|
|
map_set(globals, intern("treeCopy" ), makeFunction(prim_treeCopy, intern("treeCopy" ), null, null, globals, null)); |
|
|
map_set(globals, intern("import" ), makeFunction(prim_import, intern("import" ), null, null, globals, null)); |
|
|
map_set(globals, intern("import" ), makeFunction(prim_import, intern("import" ), null, null, globals, null)); |
|
|
map_set(globals, intern("microseconds"), makeFunction(prim_microseconds, intern("microseconds"), null, null, globals, null)); |
|
|
map_set(globals, intern("microseconds"), makeFunction(prim_microseconds, intern("microseconds"), null, null, globals, null)); |
|
|
map_set(globals, intern("string" ), makeFunction(prim_String , intern("string" ), null, null, globals, null)); |
|
|
map_set(globals, intern("string" ), makeFunction(prim_String , intern("string" ), null, null, globals, null)); |
|
|