diff --git a/atom.py b/atom.py index a53a990..ca7127e 100644 --- a/atom.py +++ b/atom.py @@ -10,4 +10,12 @@ class Atom: self.car = atom def append(self, atom: Atom): - self.cdr = atom \ No newline at end of file + self.cdr = atom + + def __str__(self): + if type(self.car) is Atom: + return "(" + self.car.__str__() + ("" if self.cdr is None else (" " + self.cdr.__str__())) + ")" + elif self.car is None: + return "()" + else: + return self.car + ("" if self.cdr is None else self.cdr.__str__()) \ No newline at end of file diff --git a/lisp.py b/lisp.py index de5bcdb..893c721 100644 --- a/lisp.py +++ b/lisp.py @@ -2,8 +2,5 @@ import atom import reader class Lisp: - def parse(self, expression): - return reader.tokenize(expression) - - def evaluate(self, expression: str): - return self.parse(expression) \ No newline at end of file + def evaluate(self, expression): + print(expression) \ No newline at end of file diff --git a/reader.py b/reader.py index 67536fb..32994c9 100644 --- a/reader.py +++ b/reader.py @@ -11,11 +11,13 @@ class Reader: self.tokens = [] self.interpreter = lisp.Lisp() + def run(self): + while self.peek() != "": + self.interpreter.evaluate(self.read_expression()) + self.consume() + def tokenize(self, expression: str): self.tokens += re.findall(r"""[\s,]*[;.*]*([()']|"(?:\\.|[^\\"])*"?|[^\s()'",;]*)""", expression) - while self.peek() != "": - self.read_expression() - self.consume() def peek(self): return self.tokens[0] @@ -25,27 +27,35 @@ class Reader: self.tokens = self.tokens[1:] return token - def read_expression(self) -> atom.Atom | None: + def read_expression(self): if len(self.tokens) == 0: return None if self.peek() == "(": self.consume() - return self.read_list() + atomlist = [] + token = self.peek() + while token != ")": + atomlist.append(self.read_expression()) + while self.peek() == "": + self.consume() + expression: str = input("... ") + self.tokenize(expression) + token = self.peek() + self.consume() + return atomlist else: return self.read_atom() - def read_list(self): - token = self.peek() - last = atom.Atom(None, None) - first = last - while token != ")": - last.setval(self.read_expression()) - last.append(atom.Atom(None, None)) - last = last.cdr - token = self.peek() - self.consume() - return first - - def read_atom(self) -> atom.Atom: - print(self.peek()) - return atom.Atom(self.consume(), None) \ No newline at end of file + def read_atom(self): + token = self.consume() + if token.upper() == "T": + return True + elif token.upper() == "NIL": + return False + try: + return int(token) + except ValueError: + try: + return float(token) + except ValueError: + return token \ No newline at end of file diff --git a/repl.py b/repl.py index 92b1fe0..92599b8 100644 --- a/repl.py +++ b/repl.py @@ -5,8 +5,9 @@ def main(): interpreter = reader.Reader() # REPL Loop while True: - expression: str = input("> ") + expression: str = input(">>> ") interpreter.tokenize(expression) + interpreter.run() if __name__ == "__main__": main() \ No newline at end of file