aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormryouse2022-06-18 02:56:25 +0000
committermryouse2022-06-18 02:56:25 +0000
commit015951495e4a0a22d89be059b46a90a296151802 (patch)
tree42a49bfc7798c92a2564ccd597f29f705f998fee
parentd1a1c1592e610526c4a0432f93bd9ea6ae96d6e8 (diff)
move Arg and Environment to structs
-rw-r--r--neb/interpreter.py54
-rw-r--r--neb/structs.py53
2 files changed, 53 insertions, 54 deletions
diff --git a/neb/interpreter.py b/neb/interpreter.py
index 760b3a6..e64e420 100644
--- a/neb/interpreter.py
+++ b/neb/interpreter.py
@@ -11,21 +11,6 @@ import random
import sys
import math
-
-class Arg:
-
- def __init__(self, name, type_, *, optional=False, lazy=False):
- self.name = name
- self.type_ = type_
- self.optional = optional
- self.lazy = lazy
-
- def __str__(self):
- opt = "?" if self.optional else ""
- lazy = "~" if self.lazy else ""
- return f"{lazy}{opt}{self.name} {self.type_}"
-
-
class Function:
def __init__(self, name, params, body, args=None, many=None):
@@ -142,45 +127,6 @@ class UserFunction(Function):
return interpret(self.body, env=this_env, ns=ns)
-class Environment:
-
- def __init__(self, parent=None):
- self.parent = parent
- self.environment = {}
-
- def register(self, key, value):
- self.environment[key] = value
-
- def reregister(self, key, value):
- if not self.contains(key):
- raise NebPanic(f"undefined symbol: '{key}")
- if key in self.environment:
- self.register(key, value)
- else:
- self.parent.reregister(key, value)
-
- def contains(self, key):
- if key in self.environment:
- return True
- elif self.parent is not None:
- return self.parent.contains(key)
- else:
- return False
-
- def get(self, key):
- if not self.contains(key):
- raise NebPanic(f"undefined symbol: '{key}")
- if key in self.environment:
- return self.environment[key]
- else:
- return self.parent.get(key)
-
- def __str__(self):
- out = ""
- for k, v in self.environment.items():
- out += f"{k}: {v}, "
- return out
-
GLOBALS = Environment()
def interpret(exprs, *, env=GLOBALS, ns=None):
diff --git a/neb/structs.py b/neb/structs.py
index 09807db..3aac72a 100644
--- a/neb/structs.py
+++ b/neb/structs.py
@@ -106,3 +106,56 @@ class List:
def __str__(self):
return "(" + " ".join(f"{arg}" for arg in self.args) + ")"
+# function things
+class Arg:
+
+ def __init__(self, name, type_, *, optional=False, lazy=False):
+ self.name = name
+ self.type_ = type_
+ self.optional = optional
+ self.lazy = lazy
+
+ def __str__(self):
+ opt = "?" if self.optional else ""
+ lazy = "~" if self.lazy else ""
+ return f"{lazy}{opt}{self.name} {self.type_}"
+
+class Environment:
+
+ def __init__(self, parent=None):
+ self.parent = parent
+ self.environment = {}
+
+ def register(self, key, value):
+ self.environment[key] = value
+
+ def reregister(self, key, value):
+ if not self.contains(key):
+ raise NebPanic(f"undefined symbol: '{key}")
+ if key in self.environment:
+ self.register(key, value)
+ else:
+ self.parent.reregister(key, value)
+
+ def contains(self, key):
+ if key in self.environment:
+ return True
+ elif self.parent is not None:
+ return self.parent.contains(key)
+ else:
+ return False
+
+ def get(self, key):
+ if not self.contains(key):
+ raise NebPanic(f"undefined symbol: '{key}")
+ if key in self.environment:
+ return self.environment[key]
+ else:
+ return self.parent.get(key)
+
+ def __str__(self):
+ out = ""
+ for k, v in self.environment.items():
+ out += f"{k}: {v}, "
+ return out
+