def transition_CONS(self): idcdr = mem.g_mem[self.S]['car'] self.S = mem.g_mem[self.S]['cdr'] idcar = mem.g_mem[self.S]['car'] self.S = mem.g_mem[self.S]['cdr'] idcons = mem.secd_mem_cons(idcar, idcdr) self.S = mem.secd_mem_cons(idcons, self.S)
def transition_RTN(self): # Ignore the residual KW_SKP! idrtn = mem.g_mem[self.S]['car'] self.S = mem.secd_mem_cons(idrtn, mem.g_mem[self.D]['car']) self.D = mem.g_mem[self.D]['cdr'] self.E = mem.g_mem[self.D]['car'] self.D = mem.g_mem[self.D]['cdr'] self.C = mem.secd_mem_cons(mem.NOP, mem.g_mem[self.D]['car']) self.D = mem.g_mem[self.D]['cdr']
def transition_SEL(self): idtest = mem.g_mem[self.S]['car'] self.S = mem.g_mem[self.S]['cdr'] idnext = mem.g_mem[ mem.g_mem[self.C]['cdr'] ]['car'] \ if (mem.TRUE == idtest) \ else mem.g_mem[ mem.g_mem[ mem.g_mem[self.C]['cdr'] ]['cdr'] ]['car'] idcont = mem.g_mem[mem.g_mem[mem.g_mem[self.C]['cdr']]['cdr']]['cdr'] self.C = mem.secd_mem_cons( mem.NOP, idnext) # C is incremented outside after transition self.D = mem.secd_mem_cons(idcont, self.D)
def secd_alist_push( key, value, alist ): """ Push a pair into association list :param key: a symbol or a list :param value: a symbol or a list :param alist: the association list :return: the extended association list """ idpair = mem.secd_mem_cons( key, value ) return mem.secd_mem_cons( idpair, alist )
def transition_LEQ(self): a = int(mem.g_symtable[-mem.g_mem[self.S]['car']]) self.S = mem.g_mem[self.S]['cdr'] b = int(mem.g_symtable[-mem.g_mem[self.S]['car']]) self.S = mem.g_mem[self.S]['cdr'] boolval = mem.TRUE if (b < a) else mem.FALSE self.S = mem.secd_mem_cons(boolval, self.S)
def transition_DIV(self): a = int(mem.g_symtable[-mem.g_mem[self.S]['car']]) self.S = mem.g_mem[self.S]['cdr'] b = int(mem.g_symtable[-mem.g_mem[self.S]['car']]) self.S = mem.g_mem[self.S]['cdr'] sym = '%d' % (b // a) # Floor division on integers self.S = mem.secd_mem_cons(-mem.secd_sym_get_create(sym), self.S)
def transition_MUL(self): a = int(mem.g_symtable[-mem.g_mem[self.S]['car']]) self.S = mem.g_mem[self.S]['cdr'] b = int(mem.g_symtable[-mem.g_mem[self.S]['car']]) self.S = mem.g_mem[self.S]['cdr'] sym = '%d' % (a * b) self.S = mem.secd_mem_cons(-mem.secd_sym_get_create(sym), self.S)
def transition_AP0(self): idpromise = mem.g_mem[self.S]['car'] idtag = mem.g_mem[idpromise]['car'] if mem.TRUE == idtag: self.S = mem.secd_mem_cons(mem.g_mem[idpromise]['cdr'], self.S) else: if mem.FALSE == idtag: self.D = mem.secd_mem_cons( self.S, mem.secd_mem_cons(self.E, mem.secd_mem_cons(self.C, self.D))) self.C = mem.secd_mem_cons( mem.NIL, mem.g_mem[mem.g_mem[idpromise]['cdr']]['car']) self.E = mem.g_mem[mem.g_mem[idpromise]['cdr']]['cdr'] self.S = mem.NIL else: pass
def transition_AP(self): def slurp(idx): if mem.KW_SKP == mem.g_mem[idx]['car']: return mem.NIL else: return mem.secd_mem_cons(mem.g_mem[idx]['car'], slurp(mem.g_mem[idx]['cdr'])) idenv = self.E idargsv = mem.g_mem[self.S]['cdr'] idargs = mem.g_mem[mem.g_mem[mem.g_mem[self.S]['car']]['car']]['car'] idnext = mem.g_mem[mem.g_mem[mem.g_mem[self.S]['car']]['car']]['cdr'] self.E = mem.g_mem[mem.g_mem[self.S]['car']]['cdr'] while mem.NIL != idargs: if mem.KW_REST == mem.g_mem[idargs]['car']: idargs = mem.g_mem[idargs]['cdr'] idslurp = slurp(idargsv) self.E = alist.secd_alist_push(mem.g_mem[idargs]['car'], idslurp, self.E) idargs = mem.g_mem[idargs]['cdr'] else: self.E = alist.secd_alist_push(mem.g_mem[idargs]['car'], mem.g_mem[idargsv]['car'], self.E) idargs = mem.g_mem[idargs]['cdr'] idargsv = mem.g_mem[idargsv]['cdr'] self.D = mem.secd_mem_cons( idargsv, mem.secd_mem_cons( idenv, mem.secd_mem_cons(mem.g_mem[self.C]['cdr'], self.D))) # self.S = mem.NIL # This caused a problem when first sexp pushed to stack is nil, as nil == (nil) == 0 in g_mem # We start with a sentinel on the stack, which will be removed by RTN (which keeps only the top) self.stack_depth += 1 # self.S = mem.secd_mem_setcdr( # mem.secd_mem_setcar( # mem.secd_mem_newcell(),-mem.secd_sym_get_create('*STACK-%d*' % self.stack_depth)), mem.NIL) self.S = mem.secd_mem_setcdr( mem.secd_mem_setcar(mem.secd_mem_newcell(), -mem.secd_sym_get_create('*FILLER*')), mem.NIL) self.C = mem.secd_mem_cons(mem.NOP, idnext)
def transition_UPD(self): idp = mem.g_mem[mem.g_mem[self.D]['car']]['car'] ids = mem.g_mem[mem.g_mem[self.D]['car']]['cdr'] ide = mem.g_mem[mem.g_mem[self.D]['cdr']]['car'] idc = mem.g_mem[mem.g_mem[mem.g_mem[self.D]['cdr']]['cdr']]['car'] idd = mem.g_mem[mem.g_mem[mem.g_mem[self.D]['cdr']]['cdr']]['cdr'] val = mem.g_mem[self.S]['car'] self.S = mem.secd_mem_cons(val, ids) self.E = ide self.C = idc self.D = idd mem.secd_mem_setcar(idp, mem.TRUE) mem.secd_mem_setcdr(idp, val)
def transition_RAP(self): idenv = mem.g_mem[self.E]['cdr'] idargsv = mem.g_mem[self.S]['cdr'] idargs = mem.g_mem[mem.g_mem[mem.g_mem[self.S]['car']]['car']]['car'] idnext = mem.g_mem[mem.g_mem[mem.g_mem[self.S]['car']]['car']]['cdr'] # self.E = mem.g_mem[mem.g_mem[self.S]['car']]['cdr'] idvals = idenv while mem.NIL != idargs: idvals = alist.secd_alist_push(mem.g_mem[idargs]['car'], mem.g_mem[idargsv]['car'], idvals) idargs = mem.g_mem[idargs]['cdr'] idargsv = mem.g_mem[idargsv]['cdr'] # print "RAP idvals> " + parse.secd_mem2sexp(idvals) # print "RAP self.E> " + parse.secd_mem2sexp(self.E) mem.secd_mem_setcar(self.E, mem.g_mem[idvals]['car']) mem.secd_mem_setcdr(self.E, mem.g_mem[idvals]['cdr']) # print "RAP idvals> " + parse.secd_mem2sexp(idvals) # print "RAP self.E> " + parse.secd_mem2sexp(self.E) self.D = mem.secd_mem_cons( idargsv, mem.secd_mem_cons( idenv, mem.secd_mem_cons(mem.g_mem[self.C]['cdr'], self.D))) self.S = mem.NIL self.C = mem.secd_mem_cons(mem.NOP, idnext)
def transition_EQ(self): ida = mem.g_mem[self.S]['car'] if ida < 0: try: a = int(mem.g_symtable[-ida]) except ValueError as err: a = -ida else: a = ida self.S = mem.g_mem[self.S]['cdr'] idb = mem.g_mem[self.S]['car'] if idb < 0: try: b = int(mem.g_symtable[-idb]) except ValueError as err: b = -idb else: b = idb self.S = mem.g_mem[self.S]['cdr'] boolval = mem.TRUE if (b == a) else mem.FALSE self.S = mem.secd_mem_cons(boolval, self.S)
def slurp(idx): if mem.KW_SKP == mem.g_mem[idx]['car']: return mem.NIL else: return mem.secd_mem_cons(mem.g_mem[idx]['car'], slurp(mem.g_mem[idx]['cdr']))
def transition_LD(self): self.C = mem.g_mem[self.C]['cdr'] val = self.env_locate(mem.g_mem[self.C]['car']) self.S = mem.secd_mem_cons(val, self.S)
def transition_LDC(self): self.C = mem.g_mem[self.C]['cdr'] self.S = mem.secd_mem_cons(mem.g_mem[self.C]['car'], self.S)
def transition_LDE(self): self.C = mem.g_mem[self.C]['cdr'] idfunx = mem.g_mem[self.C]['car'] self.S = mem.secd_mem_cons( mem.secd_mem_cons(mem.FALSE, mem.secd_mem_cons(idfunx, self.E)), self.S)
def transition_DUM(self): self.E = mem.secd_mem_cons(mem.NOP, self.E)
def transition_ATOM(self): boolval = mem.TRUE if (mem.g_mem[self.S]['car'] <= 0) else mem.FALSE self.S = mem.g_mem[self.S]['cdr'] self.S = mem.secd_mem_cons(boolval, self.S)
def transition_SKP(self): self.S = mem.secd_mem_cons(mem.KW_SKP, self.S)
def transition_JOIN(self): self.C = mem.secd_mem_cons(mem.NOP, mem.g_mem[ self.D]['car']) # C is incremented outside after transition self.D = mem.g_mem[self.D]['cdr']
def transition_CDR(self): idx = mem.g_mem[mem.g_mem[self.S]['car']]['cdr'] self.S = mem.g_mem[self.S]['cdr'] self.S = mem.secd_mem_cons(idx, self.S)