Commit 554c145a authored by Juergen Nickelsen's avatar Juergen Nickelsen
Browse files

began cleanup in object

parent 9517a366
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -151,7 +151,7 @@ def Pyle_describe(arglist):
    """@desc args: OBJ; result: description list
    Return a list of OBJ's attributes.
    """
    return arglist.car().describe()
    return p2l(arglist.car().describe())

def Pyle_debug(arglist):
    """@desc args: FLAG...; return: flags
+63 −8
Original line number Diff line number Diff line
@@ -10,7 +10,8 @@ from exceptions import *
import dep
import utils

# symbols that we need internally
# Symbols that we need internally. These need to be created ASAP, i.e. as soon
# as we have the root environment.
Nil = None
NilName = "nil"
T = None
@@ -27,6 +28,12 @@ CurrentEnv = None


def p2l(value):
    """Return an Object for value.

    If value is already an Object, return it; otherwise, create the appropriate
    Object and return it.

    """
    if isinstance(value, Object):
        return value
    elif type(value) is bool:
@@ -50,49 +57,96 @@ def p2l(value):
    else:
        return String(str(value))


class Object:
    """This is the base class for all objects, intended as purely virtual.

    """This is the base class for all objects, intended as purely abstract.
    
    There are a few default functions.
    
    """
    
    def __repr__(self):
        """Return a default string representation."""
        return "#<{n}:{i}>".format(n=self.__class__.__name__, i=id(self))

    def __str__(self):
        """Return the nicely formatted string for object."""
        return self.__repr__()
    
    def __iter__(self):
        """Return an iterator for the object. Will raise an error for most."""
        return ListIterator(self)
    
    def __bool__(self):
        """Return the boolean value of the object."""
        return self is not Nil
    
    def __format__(self, format_spec):
        """Return a formatted representation of the object."""
        return str(self).__format__(format_spec)
    
    def eq(self, obj):
        """Return true iff object is eq to obj."""
        return self is obj
    
    def type(self):
        """Return the class name of object."""
        return self.__class__.__name__
    
    def isNil(self):
        """Return true iff the object is Nil."""
        return self is Nil
    
    def isProper(self):
        """Return true iff the object is a proper list."""
        return False
    
    def dump(self):
        """Return a text dump of the object."""
        return self.__repr__()
    
    def cxr(self):
        """Return car and cdr of the object. Will be an error for most."""
        raise PyleIterateAtomError(self)
    
    def typename(self):
        """Return the lowercase class name of object."""
        return self.__class__.__name__.lower()
    
    def describe(self):
        return p2l({ "type": self.typename(), "id": id(self) })
        """Return object's attributes as a dict."""
        return { "type": intern(self.typename()), "id": id(self) }
    
    def car(self): raise PyleArgTypeError(self, 'car', 'list')
    
    def cdr(self): raise PyleArgTypeError(self, 'cdr', 'list')
    
    def rplaca(self, ob): raise PyleArgTypeError(self, 'rplaca', 'pair')
    
    def rplacd(self, ob): raise PyleArgTypeError(self, 'rplacd', 'pair')
    
    def isAtom(self): return False
    
    def isEnvironment(self): return False
    
    def isFunction(self): return False
    
    def isList(self): return False
    
    def isMacro(self): return False
    
    def isNumber(self): return False
    
    def isPair(self): return False
    
    def isString(self): return False
    
    def isSymbol(self): return False
    
    def isError(self): return False


class Error(Object):
    def __init__(self, e):
        self.e = e              # the Python exception
@@ -111,8 +165,9 @@ class Error(Object):
    def __repr__(self):
        return str(self)
    def describe(self):
        lc = ListCollector()
        return p2l(self.e.__dict__)
        a = super().describe()
        a.update(self.e.__dict__)
        return a
    
_gensym_counter = 8385

@@ -212,9 +267,9 @@ class Symbol(Object):
        else:
            raise PyleArgTypeError(self, 'cxr', 'list')
    def describe(self):
        return p2l({ "type": intern(self.typename()),
                     "props": p2l(self._props),
        })
        a = super(Symbol, self).describe()
        a["props"] = self._props
        return a

def init_symbol():
    global Nil, T, ImmutableSymbol, FunctionSymbol, NamePropSymbol, IdPropSymbol