Global.pco
)
{make_global(): {TRUE_def: 'true(x(),y()):=x()'; FALSE_def: 'false(x(),y()):=y()'; AND_def: 'and(p,q()):p(q(),false)'; OR_def: 'or(p,q()):p(true,q())'; NOT_def: 'not(p):p(false,true)'; BEGIN_def: 'begin@t:t[size(t)]'; IF_def: 'if(c,t(),e()):c(t(),e())'; WHILE_def: 'while(c(),e()):{l(v,p):p(l(e(),c()),v);l(void,c())}'; UNTIL_def: 'until(c(),e()):{l(v,p):p(v,l(e(),c()));l(e(),c())}'; FOR_def: 'for(i,p(),c(),e()):while(c(),{v:e();p();v})'; TAB_def: 'tab@t:t'; def_tab: [TRUE_def, FALSE_def, AND_def, OR_def, NOT_def, BEGIN_def, IF_def, WHILE_def, UNTIL_def, FOR_def, TAB_def]; reify_NBR(Nbr): if(Nbr[TAG_idx]=NBR_tag, Nbr[NBR_VAL_idx], error('number required')); reify_NUM(Num): if(Num[TAG_idx]=NBR_tag, Num[NBR_VAL_idx], if(Num[TAG_idx]=FRC_tag, Num[FRC_VAL_idx], error('number or fraction required'))); reify_TXT(Txt): if(Txt[TAG_idx]=TXT_tag, Txt[TXT_VAL_idx], error('text required')); reify_TAB(Tab): if(Tab[TAG_idx]=TAB_tag, Tab[TAB_TAB_idx], error('table required')); deify_NBR(Nbr): if(is_number(Nbr), NBR(Nbr), error('number required')); deify_FRC(Frc): if(is_fraction(Frc), FRC(Frc), error('number required')); deify_NUM(Num): if(is_number(Num), NBR(Num), if(is_fraction(Num), FRC(Num), error('number or fraction required'))); deify_TXT(Txt): if(is_text(Txt), TXT(Txt), error('text value required')); deify_TAB(Tab): if(is_table(Tab), TAB(Tab), error('text value required')); arg_0(Arg, Act()): {tab: reify_TAB(Arg); if(size(tab)=0, Act(), error('no arguments allowed'))}; arg_1(Arg, Act(p)): {tab: reify_TAB(Arg); if(size(tab)=1, Act(eval(tab[1])), error('1 argument required'))}; arg_1_2(Arg, Ac1(p), Ac2(p,q)): {tab: reify_TAB(Arg); if(size(tab)=1, Ac1(eval(tab[1])), if(size(tab)=2, Ac2(eval(tab[1]),eval(tab[2])), error('1 or 2 arguments required')))}; arg_2(Arg, Act(p,q)): {tab: reify_TAB(Arg); if(size(tab)=2, Act(eval(tab[1]),eval(tab[2])), error('2 arguments required'))}; size_1(Txt): if(size(Txt)=1, Txt, {error('singe character expected'); ' '}); add_fun@Arg: arg_1_2(Arg, deify_NUM(+reify_NUM(p)), if(and(p[TAG_idx]=TXT_tag, q[TAG_idx]=TXT_tag), deify_TXT(reify_TXT(p)+reify_TXT(q)), deify_NUM(reify_NUM(p)+reify_NUM(q)))); sub_fun@Arg: arg_1_2(Arg, deify_NUM(-reify_NUM(p)), deify_NUM(reify_NUM(p)-reify_NUM(q))); mul_fun@Arg: arg_2(Arg, deify_NUM(reify_NUM(p)*reify_NUM(q))); frc_div_fun@Arg: arg_2(Arg, {num: reify_NUM(q); if(num =0, error('division by zero'), deify_NUM(reify_NUM(p)/num))}); int_div_fun(#): fun@Arg: arg_2(Arg, {nbr: reify_NBR(q); if(nbr =0, error('division by zero'), deify_NBR(reify_NBR(p)#nbr))}); exp_fun@Arg: arg_2(Arg, {num: reify_NUM(p); if(num<0, error('negative base number'), deify_FRC(num^reify_NUM(q)))}); rel_fun(#): fun@Arg: arg_2(Arg, if(and(p[TAG_idx]=TXT_tag, q[TAG_idx]=TXT_tag), if(reify_TXT(p)#reify_TXT(q), True, False), if(reify_NUM(p)#reify_NUM(q), True, False))); trunc_fun@Arg: arg_1(Arg, deify_NBR(trunc(reify_NUM(p)))); abs_fun@Arg: arg_1(Arg, deify_NUM(abs(reify_NUM(p)))); char_fun@Arg: arg_1(Arg, {nbr: reify_NBR(p); if(or(nbr<0, nbr>255), error('invalid ordinal'), deify_TXT(char(nbr)))}); ord_fun@Arg: arg_1(Arg, deify_NBR(ord(size_1(reify_TXT(p))))); number_fun@Arg: arg_1(Arg, {num: number(reify_TXT(p)); if(is_void(num), Void, deify_NUM(num))}); transcendental_fun(Opr): fun@Arg: arg_1(Arg, deify_FRC(Opr(reify_NUM(p)))); explode_fun@Arg: arg_1(Arg, {c: explode(reify_TXT(p)); nbr: 0; t[size(c)]: deify_TXT(c[nbr:=nbr+1]); deify_TAB(t)}); implode_fun@Arg: arg_1(Arg, {t: reify_TAB(p); nbr: 0; c[size(t)]: size_1(reify_TXT(t[nbr:=nbr+1])); deify_TXT(implode(c))}); type_fun(Tag): fun@Arg: arg_1(Arg, if(p[TAG_idx]=Tag, True, False)); fun_fun(Arg): arg_1(Arg, if(or(p[TAG_idx]=FUN_TAG, p[TAG_idx]=NAT_TAG), True, False)); size_fun@Arg: arg_1(Arg, deify_NBR(size(reify_TAB(p)))); display_fun@Arg: {tab: reify_TAB(Arg); for(nbr: 1, nbr:=nbr+1, not(nbr > size(tab)), print(eval(tab[nbr]))); Eoln}; accept_fun@Arg: arg_0(Arg, deify_TXT(accept())); nat_tab: ['+', '-', '*', '/', '//', '\\', '^', '<', '=', '>', 'trunc', 'abs', 'char', 'ord', 'number', 'sqrt', 'sin', 'cos', 'tan', 'arcsin', 'arccos', 'arctan', 'exp', 'log', 'explode', 'implode', 'is_number', 'is_fraction', 'is_text', 'is_function', 'is_table', 'is_void', 'size', 'display','accept' ]; fun_tab: [add_fun, sub_fun, mul_fun, frc_div_fun, int_div_fun(//), int_div_fun(\\), exp_fun, rel_fun(<), rel_fun(=), rel_fun(>), trunc_fun, abs_fun, char_fun, ord_fun, number_fun, transcendental_fun(sqrt), transcendental_fun(sin), transcendental_fun(cos), transcendental_fun(tan), transcendental_fun(arcsin), transcendental_fun(arccos), transcendental_fun(arctan), transcendental_fun(exp), transcendental_fun(log), explode_fun, implode_fun, type_fun(NBR_tag), type_fun(FRC_tag), type_fun(TXT_tag), fun_fun, type_fun(TAB_tag), type_fun(VOI_tag), size_fun, display_fun, accept_fun]; make_global():= {global: make_dict(); for(idx: 1, idx:= idx+1, not(idx > size(nat_tab)), global:= add(nat_tab[idx], NAT(nat_tab[idx], fun_tab[idx]), global)); global:= add('true' , Void, global); global:= add('false', Void, global); global:= add('eoln' , Eoln, global); global:= add('void' , Void, global); init_eval(global); for(idx: 1, idx:= idx+1, not(idx > size(def_tab)), eval(read(def_tab[idx]))); True := get('true', global); False:= get('false', global); void}; make_global()}; display('global definitions installed', eoln)}
This page was made (with lots of hard work!) by Wolfgang De Meuter