Initial commit - fix problems & refactor code
This commit is contained in:
@@ -0,0 +1,55 @@
|
||||
from typing import Any
|
||||
|
||||
from core.primitives.list import cons, car, cdr, isList
|
||||
from core.primitives.symbol import isSymbol, symbolName
|
||||
from core.tokens import BaseToken, Lambda, Dambda, Macro, SpecialForm
|
||||
from core.primitives.list import NIL
|
||||
|
||||
|
||||
def Representation(obj: Any) -> str:
|
||||
"""Return a showable string representation of an object in Lisp notation.
|
||||
|
||||
Args:
|
||||
obj: The object to represent.
|
||||
|
||||
Returns:
|
||||
A string that could be parsed back by the Lisp parser.
|
||||
"""
|
||||
if obj is None:
|
||||
obj = NIL
|
||||
|
||||
if isList(obj):
|
||||
result_str: str = ""
|
||||
is_first: bool = True
|
||||
current_item: Any = obj
|
||||
while current_item != NIL:
|
||||
if is_first:
|
||||
is_first = False
|
||||
else:
|
||||
result_str += " "
|
||||
result_str += Representation(car(current_item))
|
||||
current_item = cdr(current_item)
|
||||
return f"({result_str})"
|
||||
|
||||
elif isSymbol(obj):
|
||||
return symbolName(obj) # type: ignore
|
||||
|
||||
elif isinstance(obj, str):
|
||||
return f'"{obj}"'
|
||||
|
||||
elif isinstance(obj, BaseToken):
|
||||
return obj.value
|
||||
|
||||
elif isinstance(obj, bool):
|
||||
return "true" if obj else "false"
|
||||
|
||||
elif isinstance(obj, Lambda):
|
||||
return f"({Representation(SpecialForm.LAMBDA)} {Representation(obj.args)} {Representation(obj.body)})"
|
||||
|
||||
elif isinstance(obj, Dambda):
|
||||
return f"({Representation(SpecialForm.DAMBDA)} {Representation(obj.args)} {Representation(obj.body)})"
|
||||
|
||||
elif isinstance(obj, Macro):
|
||||
return f"({Representation(SpecialForm.MACRO)} {Representation(obj.args)} {Representation(obj.body)})"
|
||||
|
||||
return str(obj)
|
||||
Reference in New Issue
Block a user