diff options
| author | mryouse | 2022-06-18 02:56:25 +0000 |
|---|---|---|
| committer | mryouse | 2022-06-18 02:56:25 +0000 |
| commit | 015951495e4a0a22d89be059b46a90a296151802 (patch) | |
| tree | 42a49bfc7798c92a2564ccd597f29f705f998fee | |
| parent | d1a1c1592e610526c4a0432f93bd9ea6ae96d6e8 (diff) | |
move Arg and Environment to structs
| -rw-r--r-- | neb/interpreter.py | 54 | ||||
| -rw-r--r-- | neb/structs.py | 53 |
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 + |
