Just wondering if it's possible to create a bunch of primitives to do the referencing?
%string-ref
%list-ref
%table-ref
Then possibly we could add to lib-ac.scm.arc:
(= call* (%table)) ;or whatever the table-creating primitive is
(%sref-table call* 'string
(fn (s i) (%string-ref s i)))
(%sref-table call* 'list
(fn (s i) (%list-ref s i)))
(%sref-table call* 'table
(fn (s i) (%table-ref s i)))
; for compatibility with existing Anarki
(set ref
(fn (c i)
(if (%is (%type c) 'string)
(%string-ref c i)
(if (%is (%type c) 'list)
(%list-ref c i)
(if (%is (%type c) 'table)
(%table-ref c i)
; dummy stub for error message, when
; errors are implemented
())))))
Then maybe change code-execute* to something like:
obj fn = SYM2OBJ("fn");
obj typ;
goto initjump;
jump:
// most common case, so check it first
if((typ = type(LOCAL(0))) == fn){
goto realjump;
} else {
memmove(&LOCAL(3),&LOCAL(2), (num_args - 2)*sizeof(obj));
++num_args;
LOCAL(2) = LOCAL(0);
LOCAL(0) = table_lookup(GLOBAL(CALL_TABLE), typ);
//possibly add a check here to see if it's a function
}
realjump:
pc = LOCAL(0)[0]; //or whichever it should be
initjump:
switch(pc){
...