40 lines
1.0 KiB
Python
40 lines
1.0 KiB
Python
from hy.lang.internals import HYNamespaceCOW
|
|
|
|
class HYObject(object):
|
|
def set_namespace(self, ns, ls):
|
|
self.namespace = ns
|
|
nns = HYNamespaceCOW(ls)
|
|
self.local_namespace = nns
|
|
|
|
for c in self.get_children():
|
|
c.set_namespace(ns, ls=nns)
|
|
|
|
def get_children(self):
|
|
return []
|
|
|
|
def __call__(self, *args, **kwargs):
|
|
return self.eval(*args, **kwargs)
|
|
|
|
def lookup(self, fn):
|
|
callee = None
|
|
if fn in self.local_namespace:
|
|
callee = self.local_namespace[fn]
|
|
|
|
if callee is None and fn in self.namespace:
|
|
callee = self.namespace[fn]
|
|
|
|
if callee is None and "." in fn:
|
|
lon, short = fn.rsplit(".", 1)
|
|
holder = self.lookup(lon)
|
|
callee = getattr(holder, short)
|
|
|
|
if callee is not None:
|
|
return callee
|
|
|
|
raise Exception("No such symbol: `%s`" % (fn))
|
|
|
|
def eval(self, *args, **kwargs):
|
|
for node in self.get_children():
|
|
node.eval(*args, **kwargs)
|
|
return self
|