示例#1
0
 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)
示例#2
0
 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']
示例#3
0
 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)
示例#4
0
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 )
示例#5
0
 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)
示例#6
0
 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)
示例#7
0
 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)
示例#8
0
 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
示例#9
0
    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)
示例#10
0
 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)
示例#11
0
 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)
示例#12
0
    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)
示例#13
0
 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']))
示例#14
0
 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)
示例#15
0
 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)
示例#16
0
 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)
示例#17
0
 def transition_DUM(self):
     self.E = mem.secd_mem_cons(mem.NOP, self.E)
示例#18
0
 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)
示例#19
0
 def transition_SKP(self):
     self.S = mem.secd_mem_cons(mem.KW_SKP, self.S)
示例#20
0
 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']
示例#21
0
 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)