importing python metacircular evaluator into git
[boa.git] / boa2 / boa / lispmod.py
blob828115560b01434d76c6dedb0e2a5d0fbbf830dd
1 """Python import hooks for importing Lisp modules into Python source
2 """
4 import sys, os, ihooks
5 from boa.environment import Environment
6 from boa.evaluator import eval
7 from boa.parser import parse
10 class LispModule:
12 def __init__(self, module_path, parent_env):
13 self.env = Environment(parent_env, {})
14 print module_path
15 self.value = eval(
16 parse(open(module_path).read()),
17 self.env)
19 def __nonzero__(self):
20 # `if m: ..' looks up m.__nonzero__
21 return True
23 def __getattr__(self, attr):
24 return self.env.lookup(attr)
26 class LispModuleLoader(ihooks.ModuleLoader):
28 def __init__(self, env):
29 self.env = env
30 ihooks.ModuleLoader.__init__(self)
32 def find_module_in_dir(self, name, dir, allow_packages=1):
33 if dir and os.path.exists(os.path.join(dir, name + ".boa")):
34 return None, name, ('', '', "lisp-module")
35 else:
36 return ihooks.ModuleLoader.find_module_in_dir(
37 self, name, dir, allow_packages)
39 def load_module(self, name, stuff):
40 file, filename, info = stuff
41 (suff, mode, type) = info
42 if type == "lisp-module":
43 m = self._import_module(filename+".boa")
44 m.__file__ = filename
45 return m
46 else:
47 return ihooks.ModuleLoader.load_module(self, name, stuff)
49 def _import_module(self, module):
50 if module in sys.modules:
51 return sys.modules[module]
52 else:
53 m = LispModule(module, self.env)
54 sys.modules[module] = m
55 return m