Skip to content

Commit 44e73e3

Browse files
committed
[refactor] Expand transpiler lookup in eval engine to support variadic arguments and flexible arity matching
- Comment out old 'length' handling to transition toward new counting logic. - Extend `transpiler_peek/6` to support `exactArgs` and `restAsList` matching styles. - Match functions by patterns like `_1_`, `_1+_`, and `_n_` in function names. - Simplify `ok_call_predicate/3` to only check interp symbols when necessary. - Update `eval_20/5` and `eval_40/5` to use `jiggle_args/6` and dynamic arity matching. - Prepare for more dynamic function dispatch from MeTTa expressions with unknown argument counts.
1 parent d45e3c3 commit 44e73e3

File tree

1 file changed

+40
-18
lines changed

1 file changed

+40
-18
lines changed

prolog/metta_lang/metta_eval.pl

Lines changed: 40 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2365,7 +2365,7 @@
23652365
if_or_else(get_type(Depth,Other,Val,Type),Type='%Undefined%'), %term_singletons(Type,[]), %Type\==[], Type\==Val,!,
23662366
do_expander(Eq,RetType,Type,TypeO).
23672367

2368-
eval_20(Eq,RetType,Depth,Self,['length',L],Res):- !, eval_args(Eq,RetType,Depth,Self,L,LL), !, (is_list(LL)->length(LL,Res);Res=1).
2368+
%eval_20(Eq,RetType,Depth,Self,['length',L],Res):- !, eval_args(Eq,RetType,Depth,Self,L,LL), !, (is_list(LL)->length(LL,Res);Res=1).
23692369
eval_20(Eq,RetType,Depth,Self,['CountElement',L],Res):- !, eval_args(Eq,RetType,Depth,Self,L,LL), !, (is_list(LL)->length(LL,Res);Res=1).
23702370

23712371
eval_20(_Eq,_RetType,_Depth,_Self,['get-metatype',Val],TypeO):- !,
@@ -3390,26 +3390,48 @@
33903390
same_terms(X,Y):- \+ compound(X), X==Y.
33913391
% Main evaluation predicate with full caching
33923392

3393-
transpiler_peek(Sym,Len,Type,Fn):-
3394-
transpiler_predicate_store(_, Sym, [Len], _, _, _, _),
3393+
%eval_40(=,_RetType,_,_,['make-var'|Types],Var):- !, 'mx__1_0+_make-var'(Types,Var).
3394+
%eval_40(=,_RetType,_,_,['bless-var',Var|Types],Var):- !, 'mx__1_1+_bless-var'(Var,Types,Var).
3395+
3396+
3397+
transpiler_peek(Sym,Len,Type,Fn, Len, exactArgs):-
3398+
if_t((var(Sym)),ignore(transpiler_predicate_store(_, Sym,_ , _, _, _, _))),
3399+
nonvar(Sym),
3400+
if_t((var(Len)),ignore(transpiler_predicate_store(_,Sym,[Len],_, _, _, _))),
33953401
if_t(var(Type),member(Type,['mx','mi','mc'])),
3402+
if_t(var(Len),between(1,10,Len)),
33963403
format(atom(Fn),'~w__1_~w_~w',[Type,Len,Sym]),
33973404
succ(Len,LenP1), current_predicate(Fn/LenP1),
3398-
if_t(nb_current('eval_in_only', interp), \+ symbol_impl_exists(interp,Sym,Len)),
3399-
nop(ok_call_predicate(Sym,Len)).
3405+
ok_call_predicate(Sym,Len,Type).
3406+
3407+
transpiler_peek(Sym,2,'mi',Fn, 2, exactArgs):-
3408+
nonvar(Sym),
3409+
atom_concat('mi__1_2_',Sym,Fn),current_predicate(Fn/3),
3410+
\+ transpiler_predicate_store(_, Sym, [2], _, _, _, _),
3411+
ok_call_predicate(Sym,Len,Type).
3412+
3413+
transpiler_peek(Sym,Len,Type,Fn, Min, restAsList):-
3414+
between(0,Len, Min),
3415+
if_t(var(Type),member(Type,['mx','mi','mc'])),
3416+
format(atom(Fn),'~w__1_~w+_~w',[Type,Min,Sym]),
3417+
succ(Min,N1),succ(N1,LenP1), current_predicate(Fn/LenP1),
3418+
ok_call_predicate(Sym,Len,Type).
34003419

3420+
transpiler_peek(Sym,Len,Type,Fn, Min, restAsList):-
3421+
between(0,Len, Min),
3422+
if_t(var(Type),member(Type,['mx','mi','mc'])),
3423+
format(atom(Fn),'~w_n_~w__~w',[Type,Min,Sym]),
3424+
succ(Min,N1),succ(N1,LenP1), current_predicate(Fn/LenP1),
3425+
ok_call_predicate(Sym,Len,Type).
34013426

34023427

34033428
ok_call_predicate(Sym,Min, _Type):-
3404-
\+ transpiler_predicate_store(_,Sym,[Min],_,_,_,_),
3405-
\+ transpiler_predicate_nary_store(_,Sym,Min,_,_,_,_,_,_),
3406-
\+ transpiler_clause_store(Sym,[Min],_,_,_,_,_,_,_).
3407-
3429+
if_t(nb_current('eval_in_only', interp), \+ symbol_impl_exists(interp,Sym,Len)).
34083430

34093431
eval_20(Eq, RetType, Depth, Self, [Sym | Args], Res) :- symbol(Sym), is_list(Args),
3410-
length(Args, Len),
3411-
memoize_tf(transpiler_peek(Sym,Len,'mi',Fn)),
3412-
append(Args, [Res], PArgs),!,
3432+
len_or_unbound(Args, Len),
3433+
transpiler_peek(Sym,Len,'mi',Fn, Min, AsList),
3434+
jiggle_args(Args,Res,Len,Min,AsList,PArgs),
34133435
with_metta_ctx(Eq, RetType, Depth, Self, [Sym | Args], apply(Fn, PArgs)).
34143436

34153437
jiggle_args(Args,Ret,LenIsMin,LenIsMin,exactArgs,PArgs):- !, append(Args, [Ret], PArgs).
@@ -3420,15 +3442,15 @@
34203442
jiggle_append(Left,Right,Ret,exactArgs,PArgs):- append(Left, [Ret], PArgs), !, must_unify(Right,[]).
34213443

34223444
eval_20(Eq, RetType, Depth, Self, [Sym | Args], Res) :- symbol(Sym), is_list(Args),
3423-
length(Args, Len),
3424-
memoize_tf(transpiler_peek(Sym,Len,'mx',Fn)),
3425-
append(Args, [Res], PArgs),!,
3445+
len_or_unbound(Args, Len),
3446+
transpiler_peek(Sym,Len,'mx',Fn, Min, AsList),
3447+
jiggle_args(Args,Res,Len,Min,AsList,PArgs),
34263448
with_metta_ctx(Eq, RetType, Depth, Self, [Sym | Args], apply(Fn, PArgs)).
34273449

34283450
eval_40(Eq,RetType,Depth,Self,[Sym|Args],Res):- symbol(Sym), is_list(Args),
3429-
length(Args,Len),
3430-
memoize_tf(transpiler_peek(Sym,Len,'mc',Fn)),
3431-
append(Args,[Res],PArgs),!,
3451+
len_or_unbound(Args,Len),
3452+
transpiler_peek(Sym,Len,'mc',Fn, Min,AsList),
3453+
jiggle_args(Args,Res,Len,Min,AsList,PArgs),
34323454
with_metta_ctx(Eq,RetType,Depth,Self,[Sym|Args],apply(Fn,PArgs)).
34333455

34343456

0 commit comments

Comments
 (0)