def eval_if(lists,final,count): """Evaluates the predicate of the 'if' condition""" if count==0 and len(final) != 0: expr,move=eval_expr(final),0 for i in func_dict: if i in func_dict[i]: move=1 if move==1: if expr==0: lists=if_cons_alt(ops.rest1(lists),[],0) else:lists=if_cons_alt(ops.rest1(lists),[],0) if expr==1:return lists[0],1 else:return lists[1],0 if ops.first(lists).isalpha(): final=ops.append(final,[local_dict[ops.first(lists)]]) return eval_if(ops.rest(lists),final,count) if ops.first(lists)=='(': count+=1 return eval_if(ops.rest(lists),ops.append(final,[ops.first(lists)]),count) elif ops.first(lists)==')': count=count-1 return eval_if(ops.rest(lists),ops.append(final,[ops.first(lists)]),count) else:return eval_if(ops.rest(lists),ops.append(final,[ops.first(lists)]),count)
def evaluate(lists,final): """Performs arithmetic and logical operations""" if ops.null(lists):return final[0] elif ops.first(lists)=='(':return evaluate(ops.rest(lists),final) elif ops.first(lists).isdigit():return evaluate(ops.rest(lists),ops.append(final,[int(ops.first(lists))])) elif ops.first(lists)==')': op=opdet(final) if op=='+':f=add elif op=='*':f=mul elif op=='/':f=div elif op=='-':f=sub elif op=='%':f=mod elif op=='>':f=gt elif op=='and':f=and_ elif op=='<':f=lt elif op=='=':f=eq result=ops.last(final) final=ops.rest1(final) while type(ops.last(final))==int: result=int(f(ops.last(final),result)) final=ops.rest1(final) final=ops.rest1(final) return evaluate(ops.rest(lists),ops.append(final,[result])) else:return evaluate(ops.rest(lists),ops.append(final,[ops.first(lists)]))
def opdet(dummy): """Determines the operator""" if type(ops.last(dummy))==int:return opdet(ops.rest1(dummy)) else:return ops.last(dummy)
def gravity(lists): """Initial function for checking the current input""" if lists[1]=='if':return if_begin_eval(lists) elif lists[1]=='define' and lists[2]=='(': eval_define(ops.rest(ops.rest(lists))) return 'Environement created' elif lists[1]=='define': create_env(ops.rest(ops.rest(lists))) return 'Environement created ' elif lists[1].isalpha() and lists[1] in func_dict:return exec_call(lists[1],ops.rest(ops.rest1(lists))) else: lists=from_env(lists) return evaluate(lists,[])
def create_localenv(lists): """Creates the environement for the function""" func_dict[ops.first(ops.rest(lists))]=ops.rest(ops.rest(ops.rest1(ops.rest1(lists))))